2010-11-26 19 views
5

Necesito escribir algún código para verificar que una macro está definida pero vacía (sin ningún valor). La prueba no necesita estar en tiempo de compilación.Pruebe si el valor de una macro de C está vacío

Estoy intentando escribir:

#if (funcprototype == "") 
MY_WARN("funcprototype is empty"); 
#endif 

el código no compila, como funcprototype se expande a vacío.

+0

La prueba no necesita ser una prueba en tiempo de compilación, pero ¿desea utilizar el resultado en una directiva '# if'? ¿Qué pasa si 'funcprototype' tiene una lista de reemplazo no vacía, pero después del reemplazo se expande a nada (debido a la nueva exploración). –

+0

Esto parece ser un duplicado de http://stackoverflow.com/questions/4102351/test-for-empty-macro-definition –

Respuesta

5

Si un cheque en tiempo de ejecución está bien, entonces se puede probar la longitud de la sustitución Stringized:

#define REAL_STRINGIZE(x) #x 
#define STRINGIZE(x) REAL_STRINGIZE(x) 

if (STRINGIZE(funcprototype)[0] == '\0') { 
    // funcprototype expanded to an empty replacement list 
} 
else { 
    // funcprototype expanded to a non-empty replacement list 
} 

No creo que hay un caso general "es esta macro sustituido por un vacío secuencia de tokens "verificación en tiempo de compilación". Ese es un problema similar a "es posible comparar dos secuencias de tokens para igualdad", lo cual es imposible de hacer en tiempo de compilación.

+1

depende de lo que se pueda suponer sobre la secuencia de token. ver p. [esta tonta macro] (http://alfps.wordpress.com/2010/05/06/cppx-a-simple-unit-tests-framework/) mía. ** hark ** (anticipiating obvio pregunta) bien fue hecho para un propósito muy especial –

+1

Para que esto funcione en Visual Studio, el 'STRINGIZE (x)' debe definirse como '# x' de lo contrario la sustitución a' REAL_STRINGIZE 'macro falla si' x' es una macro vacía (terminará con un error de "no suficientes argumentos"). ¿Hay alguna razón por la cual la macro está en dos niveles como este? Lo he visto antes pero no he leído ninguna buena explicación de por qué es eso? –

+0

No importa, encontré mi respuesta aquí: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan. Dejándolo aquí para cualquiera que lo encuentre útil. –

Cuestiones relacionadas