C Präprozessor generiert Makros durch Verkettung und Stringifizierung [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Was sind die Anwendungen des ## Präprozessor-Operators und der Fallstricke zu beachten? 13 answers

Ich habe eine Reihe von Zielmakros, für die ich Aliase basierend auf einem Auswahlmakro generieren möchte, wie folgt:

Wählendes Makro:

#define I2C_MODULE 1

Alias-Makros (konzeptionelle Form):

#define I2C_MODULE_BASE I2C<Value of I2C_MODULE>_BASE
#define I2C_MODULE_NVIC INT_I2C<Value of I2C_MODULE>

Zielmakros (aus einer externen Datei, die sich meiner Kontrolle entzieht):

#define INT_I2C0   24 
#define INT_I2C1   53
...
#define I2C0_BASE  0x40020000
#define I2C1_BASE  0x40021000
...   

Ich wollte, dass der Präprozessor die Alias-Makros generiert.I2C_MODULE_BASE undI2C_MODULE_NVIC basierend auf dem AuswahlmakroI2C_MODULE, aber nach vielem Lesen Q1, P1 und viele andere Referenzen, die ich aus den Augen verloren habe, habe ich letztendlich ihre Werte hart codiert. Unten zeige ich meine aktuellen Arbeitsdefinitionen und dann meine letzten fehlgeschlagenen Versuche, die Makros zu generieren:

Was funktioniert

#define I2C_MODULE 1
#define I2C_MODULE_BASE I2C1_BASE
#define I2C_MODULE_NVIC INT_I2C1

was hat nicht funktioniert

#define I2C_MODULE 1
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

/* Attempt 1 */
#define I2C_MODULE_BASE "I2C" STR(I2C_MODULE) "_BASE"
#define I2C_MODULE_NVIC "INT_I2C" STR(I2C_MODULE)

/* Attempt 2 */
#define _I2C_MODULE_BASE "I2C" STR(I2C_MODULE) "_BASE"
#define _I2C_MODULE_NVIC "INT_I2C" STR(I2C_MODULE)
#define I2C_MODULE_BASE _I2C_MODULE_BASE
#define I2C_MODULE_NVIC _I2C_MODULE_NVIC

EDIT: Ich habe das @ erweiteakzeptierte Antwort um dorthin zu gelangen, wo ich wollte, wie folgt:

#define PASTE2(a, b) a ## b
#define PASTE3(a, b, c) a ## b ## c

#define _I2C_MODULE_BASE(x) PASTE3(I2C, x, _BASE)
#define _I2C_MODULE_NVIC(x) PASTE2(INT_I2C, x)

#define I2C_MODULE_BASE _I2C_MODULE_BASE(I2C_MODULE)
#define I2C_MODULE_NVIC _I2C_MODULE_NVIC(I2C_MODULE)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage