2012-09-27 15 views
13

Così qui sono alcune macro che ho creato:C: Espandere macro con Token incollare

#define MODULE_NAME moduleName 
#define MODULE_STRUCT MODULE_NAME ## _struct 
#define MODULE_FUNCTION(name) MODULE_NAME ## _ ## name 

Dopo queste definizioni, vorrei i seguenti espansioni per accadere:

MODULE_STRUCT --> moduleName_struct 
MODULE_FUNCTION(functionName) --> moduleName_functionName 

Tuttavia, quando ho aggiungi gli operatori di incollaggio dei token, l'espansione di MODULE_NAME all'interno di MODULE_FUNCTION e MODULE_STRUCT non avviene più ... Sembra che MODULE_NAME sia considerato come una stringa letterale quando li si incolla.

C'è un modo per aggirare questo?

risposta

15

In C gli operandi dell'operatore di scambio di token ## non vengono espansi.

È necessario un secondo livello di riferimento indiretto per ottenere l'espansione.

#define CAT(x, y) CAT_(x, y) 
#define CAT_(x, y) x ## y