sirve que para ifdef example endif c c-preprocessor

c - que - #ifdef dentro de#define



ifdef c++ para que sirve (6)

Estoy tratando de escribir algo como esto:

#define COV_ON(x) / #ifdef COVERAGE_TOOL / _Pragma (COVERAGE #x) #endif

¿Hay alguna manera de definir COV_ON esta manera? Sé que lo que he hecho arriba está mal, ya que no puedo tener #ifdef dentro de #define. ( # no es un carácter permitido en #define ). Entonces, ¿hay alguna solución?


Como mencionaste, no es posible tener un #ifdef en un #define. Lo que debes hacer en cambio es revertir el orden:

#ifdef COVERAGE_TOOL / #define COV_ON(x) / etc. #endif


Esta es una pregunta antigua, pero necesitaba una respuesta actualizada.

En lugar de utilizar un ifdef en línea dentro de la macro, puede definir selectivamente una macro __VA_ARGS__ para hacer lo mismo

#ifdef COVERAGE_TOOL #define IF_COVERAGE_TOOL(...) __VA_ARGS__ #else #define IF_COVERAGE_TOOL(...) #endif #define COV_ON(x) IF_COVERAGE_TOOL( _Pragma (COVERAGE #x) )

Esto tiene una funcionalidad similar a la de ifdef, excepto que tiene paréntesis para delinear el principio y el final (que la mayoría de los IDE no tienen problemas para plegar el código). Si bien todavía puede usar #define y #ifdef dentro del contexto, #include no está permitido. Para obtener capacidades en línea similares a #else , puede definir una macro correspondiente como esta:

//#define FOO #ifdef FOO #define IF_FOO(...) __VA_ARGS__ #define NO_FOO(...) #else #define IF_FOO(...) #define NO_FOO(...) __VA_ARGS__ #endif IF_FOO( #define BAR 5 int foo = BAR; ) NO_FOO( #define foo 5 )

Solo uno de NO_FOO()/IF_FOO producirá el código.

Ok, eso es un truco práctico, pero ¿podemos hacerlo MÁS útil que #ifdefs ... #ifdefs la lógica y configuración booleanas? Vamos a configurar algunas tablas de verdad (y un par de macros de ayuda).

#define PASTE_(x,y) x##y #define PASTE(x,y) PASTE_(x,y) #define PASTE3_(x,y,z) x##y##z #define PASTE3(x,y,z) PASTE3_(x,y,z) #define Y(...) __VA_ARGS__ #define N(...) #define IF(x) x //alternate method similar to IFNOT() #define NOT_N Y #define NOT_Y N #define IF_NOT(x) PASTE(NOT_,x) #define NOT(x) PASTE(NOT_,x) #define N_OR_N N #define N_OR_Y Y #define Y_OR_N Y #define Y_OR_Y Y #define OR(x,y) PASTE3(x,_OR_,y) #define N_AND_N N #define N_AND_Y N #define Y_AND_N N #define Y_AND_Y Y #define AND(x,y) PASTE3(x,_AND_,y) #define N_XOR_N N #define N_XOR_Y Y #define Y_XOR_N Y #define Y_XOR_Y N #define XOR(x,y) PASTE3(x,_XOR_,y) #define N_NOR_N Y #define N_NOR_Y N #define Y_NOR_N N #define Y_NOR_Y N #define NOR(x,y) PASTE3(x,_NOR_,y) #define N_NAND_N Y #define N_NAND_Y Y #define Y_NAND_N Y #define Y_NAND_Y N #define NAND(x,y) PASTE3(x,_NAND_,y) #define N_XNOR_N Y #define N_XNOR_Y N #define Y_XNOR_N N #define Y_XNOR_Y Y #define XNOR(x,y) PASTE3(x,_XNOR_,y) #define IF2(x,y,z) PASTE3(x,y,z)

config.h

#define FOO Y #define BAR N #define BAZ Y

código.c

AND(FOO,BAR)(/*do stuff if both FOO and BAR are enabled*/) IF2(FOO,_AND_,BAR)( /*do stuff if both FOO and BAR are enabled*/ ) OR(BAZ,AND(FOO,BAR))( /*do stuff if both FOO and BAR are enabled or BAZ is enabled*/ )


Imposible. Hazlo al revés:

#ifdef COVERAGE_TOOL #define COV_ON(x) _Pragma (COVERAGE #x) #else #define COV_ON(x) #endif


No se puede. Pero puedes intercambiar #ifdef y #define :

#ifdef COVERAGE_TOOL # define COV_ON(x) _Pragma (COVERAGE #x) #else # define COV_ON(x) #endif


Simplemente dale la vuelta:

#ifdef COVERAGE_TOOL #define COV_ON(x) _Pragma (COVERAGE #x) #else #define COV_ON(x) /* foo */ #endif


#ifdef COVERAGE_TOOL #define COV_ON(x) _Pragma (COVERAGE #x) #else #define COV_ON(x) #endif