mikrocontroller.net

Forum: Compiler & IDEs Glue Operator bei include


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ist es irgendwie möglich den Glue-Operator ("##") auch bei der Angabe 
eines Headerfiles zu verwenden?
Dummycode (nach dem ersten Durchlauf des Präprozessors soll da "#include 
"bla_XYZ.h" stehen):
#define USE_TYPE     XYZ
#include "bla_"##USE_TYPE##".h"
geht schon mal nicht.
Auch das hier war ohne Erfolg:
#define USE_TYPE     XYZ
#define HEADER_FILE_NAME "bla_"##USE_TYPE##".h"
#include HEADER_FILE_NAME 
Genauso wenig funktioniert hat das
#define PASTER3(x,y,z) x ## y ## z
#define EVALUATOR3(x,y,z) PASTER3(x,y,z)
#define HEADER_FILE_NAME EVALUATOR3(bla_,USE_TYPE,.h)
#include EVALUATOR3(\",HEADER_FILE_NAME,\")
oder ähnliche Kombinationsmöglichkeiten, die mir eingefallen sind, 
funktioniert.

Deshalb die Frage:
Geht das überhaupt?

Ziel soll es sein, dass man für einen neuen Typ einfach ein neues c- und 
h-File mit gegebenen Namensschema anlegt und einfach nur das Makro 
USE_TYPE anpasst. Im Code soll dann automatisch das richtige Headerfile 
eingebunden und die passende Init ( Parser_Type_XYZ_Init() ) aufgerufen 
werden.
Der Funktionsname wird richtig über EVALUATOR3 und PASTER3 
zusammengebaut.
Bei dem include scheitere ich jedoch. - Leider.

Könnt ihr mir bitte weiterhelfen!? - Danke!

Grüße
Felix

Autor: Sven B. (scummos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss das wirklich sein? Hier ist doch sicherlich der Punkt 
überschritten, wo ein Code-Generator übersichtlicher und einfacher ist.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich denke, dass ist wie beim Geschmack, über den sich bekanntlich 
streiten lässt.
Für mich ist das kein Problem. - Im Gegenteil! Ich wünsche es mir ja, 
dass es so funktioniert. Sonst würde ich mich mit dem Thema nicht 
befassen, oder gar hier fragen, ob und wie das funktioniert.

Grüße
Felix

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na hoffentlich passiert nichts komisches, wenn jemand versehentlich den 
falschen Header inkludiert. Generell sollte es kein Problem sein 
beliebige Header zu inkludieren (außer verlängerter Zeit zum 
Kompilieren) und auch eine beliebige Reihenfolge dafür zu wählen. Jeder 
Header sollte alles was er braucht selbst inkludieren, sodass egal was 
man in egal welcher Reihenfolge nutzt es niemals einen Compiler-Fehler 
gibt.

Was genau ist denn das Problem dass du so eine Konstruktion brauchst?

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So:
#define CATH(x,y) x ## y.h
#define STR1(x) #x
#define STR(x) STR1(x)
#define STRCATH(x,y) STR(CATH(x,y))

#define USE_TYPE XYZ

#include STRCATH(bla_,USE_TYPE)

: Bearbeitet durch Moderator
Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Yalu:
Danke! Geht!

Das war das, was zu diesem Beitrag gefehlt hat:
https://stackoverflow.com/questions/4743822/generate-include-file-name-in-a-macro 
;-)

Autor: Dirk K. (merciless)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir da einfällt, ist um Welten einfacher:

im Projekt:
#include "my_global_system_definition.h"

im File "my_global_system_definition.h"
#include "my_specific_type.h"

"my_global_system_definition.h" muss nur einmal
für die spezielle Anwendung angepasst werden.

merciless

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.