2011-12-21 21 views
8

que estoy tratando de hacer (lo que habría pensado) era una expansión de macro sencillaC pre-procesador de macros de expansión

#define CLEAR_DIGIT(a,b) iconMap[a] &= ~(b) 
#define R1 4, 16 
CLEAR_DIGIT(R1); 

Ahora me esperaría que para ampliar a CLEAR_DIGIT (4,16) que se expande a iconMap [4] & = ~ 16 sin embargo, no ... Si hago CLEAR_DIGIT una función:

void ClearDigit(unsigned char a, unsigned char b) 
{ 
    iconMap[a] &= ~b; 
} 
#define R1 4, 16 
ClearDigit(R1); 

entonces funciona bien, así que R1 está ampliando a los dos argumentos no es un problema ... ¿Hay alguna forma de obligarlo a expandir R1 antes de hacer la expansión de la función de macro?

+1

relacionadas: http://stackoverflow.com/questions/3776750/macros-evaluation-in-c-programming-language – MByD

Respuesta

11

Puede usar una macro auxiliar. Ver también double-stringize problem

#define CLEAR_DIGIT_HELPER(a,b) iconMap[a] &= ~(b) 
#define CLEAR_DIGIT(x) CLEAR_DIGIT_HELPER(x) 
#define R1 4, 16 
CLEAR_DIGIT(R1); 
+0

1 - me adelantó :) – bitmask

+1

Es una respuesta fina , pero no explica * por qué * esto funciona. El problema vinculado de doble cadena es notablemente diferente: hay reglas especiales cuando se usan '#' y '##'. Esas reglas no se aplican aquí. – jwd

Cuestiones relacionadas