Präprozessor und Verkettung - Problem!
-
Hallo Leute,
zunächst mal, ich habe wirklich viele Foren gewälzt und google gequält, doch keine Lösung für mein Problem gefunden. Ich vermute, es geht einfach nicht, wie ich mir das vorstelle, aber ich lasse mich gern von euch vom Gegenteil überzeugen
Mein Code:
// Irgendwo vorher definiert #define PRAEFIX_20_SUFFIX1 irgendwas #define PRAEFIX_20_SUFFIX2 irgendwas // später ... // Define #define DAWIRDNEZAHLDEFINIERT 20 // Makros für Umwandlung #define Makro1(xXx) PRAEFIX_##xXx##_SUFFIX1 #define Makro2(yYy) PRAEFIX_##yYy##_SUFFIX2 // Einsetzen in Defines #define DEF1 Makro1(DAWIRDNEZAHLDEFINIERT) #define DEF2 Makro2(DAWIRDNEZAHLDEFINIERT)
Was ich möchte ist einfach, dass da rauskommt:
#define DEF1 PRAEFIX_20_SUFFIX1 #define DEF2 PRAEFIX_20_SUFFIX2
tut's aber nicht
Da kommt nur raus: #define DEF1 PRAEFIX_DAWIRDNEZAHLDEFINIERT_SUFFIX1 .... dieses Define gibt es natürlich nicht!Sieht jemand, was ich falsch mache? Und fragt bitte nicht, was ich damit bezwecken will, dies ist nur ein Beispiel meines konkreten Falls, der macht dann schon Sinn
Danke für eure Hilfe, ich bin auch mit ner Antwort alá "geht nicht!" zufrieden
Grüße
-
ungefähr so:
#define ZAHL 20 #define PREFIX lala #define SUFFIX dumm #define STR(x) #x #define STRINGIFY(x) STR(x) #define MACRO(x) STRINGIFY(PREFIX)##"_"##STRINGIFY(x)##"_"##STRINGIFY(SUFFIX) #define DEF1 MACRO(ZAHL)
^^siehe DEF1
-
EDIT: Hab mich geirrt, geht doch. fricky hat's drauf!
-
_matze schrieb:
...
drei pünktchen?
-
~fricky schrieb:
_matze schrieb:
...
drei pünktchen?
Ich war mir sicher, das geht nicht und hab das halbwegs ausführlich erklärt! Dann hast du gepostet, und da dachte ich mir, bevor ich mich lächerlich mache (was ich hiermit tue), wird's erstmal schnell wieder gelöscht...
-
Erstmal danke für die super schnelle Antwort
Doch der Compiler bemeckert einen Fehler: char* ist nicht u8 ...
Kann es sein, dass dein Vorschlag auf folgendes Ergebnis kommt:
#define DEF1 "PRAEFIX_20_SUFFIX1"
???
Wenn ja, dann wird das doch als char angesehn und nicht mehr weiter ersetzt oder? Kann das sein? Wenn ja, wie bekomme ich das gleiche Ergebnis, nur ohne Anführungszeichen?
Danke mal für die Hilfe
-
Tja, er setzt dir nur einen String zusammen. Dann klappt's wohl doch nicht... konnte ich mir auch nur schwer vorstellen...
-
_matze schrieb:
...und da dachte ich mir, bevor ich mich lächerlich mache (was ich hiermit tue), wird's erstmal schnell wieder gelöscht
jaja, die allgegenwärtige angst registrierter user vor ewiger schande.
Hundehaufen schrieb:
Kann das sein? Wenn ja, wie bekomme ich das gleiche Ergebnis, nur ohne Anführungszeichen?
so dass du's z.b. als variablenname verwenden kannst?
so etwa:#define ZAHL 20 #define PREFIX lala_ #define SUFFIX _dumm #define MK(x) x #define M1(x) MK(PREFIX)##MK(x) #define M2(x) M1(x)##MK(SUFFIX) #define DEF1 M2(ZAHL) void main (void) { int DEF1; // <-- ist das lala_20_dumm ? lala_20_dumm = 3; // <-- beweis: compiler meckert nicht }
^^geht zumindest mit meinem compiler. kann aber sein, dass man's noch vereinfachen kann.
-
~fricky schrieb:
^^geht zumindest mit meinem compiler. kann aber sein, dass man's noch vereinfachen kann.
Check this out:
#define MK(x) x #define M1(x) MK(x) #define KAGGA(x) M1(A_##x##_B) int main() { int KAGGA(99); A_99_B = 88; return 0; }
-
Big Brother schrieb:
Check this out:
du hast vergessen, ZAHL, PREFIX und SUFFIX einzubauen.
-
Ömm, die Zahl ist das x.
Präfix und Süffix ist 'festgebrannt' als A und B.
-
B.B. schrieb:
Ömm, die Zahl ist das x.
Präfix und Süffix ist 'festgebrannt' als A und B.das eigentliche anliegen des OP war doch gerade, dass der preprozzi diese #defines nicht expandiert hat. die kannste jetzt doch nicht einfach rausschmeissen.
-
Das ist wegoptimiert :p
Dachte, der OP will nen variablen Mittelteil des Macros.
Hab ich wohl nicht aufgepasst.
-
~fricky - du bist super!
Also, dein Vorschlag war:
#define ZAHL 20 #define PREFIX lala_ #define SUFFIX _dumm #define MK(x) x #define M1(x) MK(PREFIX)##MK(x) #define M2(x) M1(x)##MK(SUFFIX) #define DEF1 M2(ZAHL) void main (void) { int DEF1; // <-- ist das lala_20_dumm ? lala_20_dumm = 3; // <-- beweis: compiler meckert nicht }
Das hab ich so ausprobiert, aber festgestellt, dass mein Compiler diese Makros nicht verkettet hat, es kam immer "lala_" raus, den Rest hat er verschluckt. Dann hab ich das leicht modifiziert und sieht jetzt so aus:
#define ZAHL 20 #define PREFIX lala_ #define SUFFIX _dumm #define M1(x,y,z) x##y##z #define M2(x,y,z) M1(x,y,z) #define DEF1 M2(PREFIX,ZAHL,SUFFIX)
Und siehe da - das funktioniert
Der Sinn des ganzen ist, dass die Defines der Form "lala_20_dumm" bereits existieren und sowohl die Zahl als auch das Suffix sich verändern können. Aber so kann ich jetzt immer das aus den drei Teilen zusammenbauen, was unheimlich viel Code spart.
Echt danke ~fricky
-
Glücklicher Hundehaufen schrieb:
Echt danke ~fricky
gern geschehen.