Forum: Compiler & IDEs Glue Operator bei include


von Felix (Gast)


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):
1
#define USE_TYPE     XYZ
2
#include "bla_"##USE_TYPE##".h"
geht schon mal nicht.
Auch das hier war ohne Erfolg:
1
#define USE_TYPE     XYZ
2
#define HEADER_FILE_NAME "bla_"##USE_TYPE##".h"
3
#include HEADER_FILE_NAME
Genauso wenig funktioniert hat das
1
#define PASTER3(x,y,z) x ## y ## z
2
#define EVALUATOR3(x,y,z) PASTER3(x,y,z)
3
#define HEADER_FILE_NAME EVALUATOR3(bla_,USE_TYPE,.h)
4
#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

von Sven B. (scummos)


Lesenswert?

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

von Felix (Gast)


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

von Dr. Sommer (Gast)


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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

So:
1
#define CATH(x,y) x ## y.h
2
#define STR1(x) #x
3
#define STR(x) STR1(x)
4
#define STRCATH(x,y) STR(CATH(x,y))
5
6
#define USE_TYPE XYZ
7
8
#include STRCATH(bla_,USE_TYPE)

: Bearbeitet durch Moderator
von Felix (Gast)


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 
;-)

von Dirk K. (merciless)


Lesenswert?

Was mir da einfällt, ist um Welten einfacher:

im Projekt:
1
#include "my_global_system_definition.h"

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

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

merciless

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.