Forum: Compiler & IDEs ## in Dateinamen von includes


von Harald (Gast)


Lesenswert?

Hallo!

In Abhängigkeit eines Makros werden unterschiedliche Header inkludiert, 
aber immer nur eins.
1
#define TEST
2
//#define TYPE_A
3
//#define TYPE_B
4
5
#ifdef TEST
6
#include "rk_test.h"
7
#endif
8
#ifdef TYPE_A
9
#include "rk_type_a.h"
10
#endif
11
#ifdef TYPE_B
12
#include "rk_type_b.h"
13
#endif

Daher kam mir der Gedanke das mit einer Preprozessor-Anweisung zu 
machen:
1
#define CONFIG_FILE test
2
//#define CONFIG_FILE type_a
3
//#define CONFIG_FILE type_b
4
5
#include "rk_##CONFIG_FILE##.h"

Nur geht das leider (so) nicht. :-(

Auch irgendwelche Zwischenschritte, brachten kein Erfolg:
1
#define CONFIG_FILE test
2
//#define CONFIG_FILE type_a
3
//#define CONFIG_FILE type_b
4
5
#define FILENAME rk_##CONFIG_FILE##.h 
6
//#include FILENAME
7
#include "FILENAME"

Gibt es eine Möglichkeit meine Idee umzusetzen?

Danke & Grüße
Harald

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Harald schrieb:
> Gibt es eine Möglichkeit meine Idee umzusetzen?

Ich denke nicht.  Hinter #include muss unmittelbar ein String stehen,
deine Operatoren funktionieren aber nur innerhalb von Makros.

(Zumindest habe ich das so in Erinnerung, Details müsste ich auch im
Standard nachlesen.)

von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Ich denke nicht.  Hinter #include muss unmittelbar ein String stehen,

Da darf auch ein Makro stehen, das einen String enthält. Allerdings 
wüßte ich nicht, wie man diesen mehrteiligen String zu einem 
zusammengesetzt bekommt.

von Stefan E. (sternst)


Lesenswert?

Dass das eine "Element" mit einem Punkt beginnt, macht etwas 
Probleme(*), aber so was geht problemlos:
1
#define CAT3_(a,b,c)  a##b##c
2
#define CAT3(a,b,c)  CAT3_(a,b,c)
3
4
#define STR_(s)  #s
5
#define STR(s)  STR_(s)
6
7
8
#define CONFIG_FILE  test
9
10
#include STR(CAT3(rk_,CONFIG_FILE,_.h))


(*) mit .h kommt dieser Fehler:
1
pasting "rk_test" and "." does not give a valid preprocessing token

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sowas geht:
1
#define CONFIG_FILE test
2
3
#define DD(X) #X
4
#define CC(X,Y) DD(X ## Y)
5
#define BB(X,Y) CC(X, Y)
6
#define AA BB(rk_,CONFIG_FILE.h)
7
8
#include AA

Übersichtlicher macht das es aber nicht...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Da darf auch ein Makro stehen

OK, dann ziehe ich meinen Einwand zurück.  Johann hat ja die Lösung
schon gepostet.

Nun ist es an Harald zu entscheiden, ob er das wirklich so will. :-)

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.