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