gegeben ist folgendes: gcc -DFOO=hallo -DBAR=welt ... jetzt möchte ich gerne im Code stehen haben #define BAZ simsalabim(FOO, BAR) und der hier stellvertretend mit simsalabim umschriebene Ausdruck soll so funktionieren daß BAZ hinterher zu "hallo welt" (mitsamt den Quotes) expandiert. Ist das überhaupt möglich, und wenn ja was muss ich an der Stelle hinschreiben?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Gast
#5989790
Ganz genau das ist nicht möglich, aber beachte, dass "hallo" " " "welt" vom Kompiler in der regel bleich behandelt wird wie "hallo welt". Wenn FOO und BAR garantiert immer nur alphanumerische Zeichen enthalten, also keine Sonderzeichen enthalten, könnte man sowas versuchen:
1 | |
2 | |
3 | |
4 | |
Andernfalls könntest du auch die Quotes bei FOO und BAR schon mitgeben:
1 | |
Und dann:
1 | |
A. K. schrieb: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
FOO BAR
Stimmt, siehe DPA. Gleiches Prinzip, aber eine Expansionsebene mehr.
Ja, die Lösung von DPA funktioniert. Danke. Quotes direkt bei den -DSYMBOL=WERT kann ich leider nicht machen weil da noch etliche #if überall dranhängen die ich nicht ändern will und das mit den Strings auch nur ein zusätzliches Sahnehäubchen sein soll, nicht der Hauptverwendungszweck der Defines. Die Defines sind Namen für Varianten und Untervarianten einer Firmware die alle automatisch gebaut werden und die soll unter anderem auch einen String ausgeben können an dem man später unkompliziert ablesen kann welche Variante da draufgeflasht wurde. Als damals noch nur 3 mögliche Kombinationen überhaupt existierten hatte ich diese Strings einfach hart kodiert aber jetzt werden noch mehr Varianten und Untervarianten hinzukommen und im Zuge des vorauseilenden Refactorns etlicher nun drohender #if/#elif-Monster will ich das kein zweites mal mehr anfassen müssen und so soll unter anderem der String jetzt automatisch generiert werden.
Verflucht! Das geht auch nicht so wie ich mir das vorstelle. Denn damit die ganzen #if die über den ganzen Code versprenkelt sind auch funktionierten sind in einem zentralen Header all den erlaubten Strings die man da reinfüttern kann numerische Werte zugewiesen (damit Vergleiche im Preprozessor funktionieren):
1 | |
2 | |
3 | |
so daß man später das machen kann:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Wenn man jetzt gcc -DVARIANT=bar sagt wird daraus nach dem Preprozessor:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Jetzt komm ich natürlich nicht mehr an meine ursprünglichen sprechenden Variantennamen ran weil das alles sofort durch die Zahlenwerte ersetzt wird. Aus meinem erhofften "hallo welt" wird dann sofort sowas wie "2 4" :-(
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.