#ifdef dentro de #define


83

Estoy tratando de escribir algo como esto:

¿Hay alguna forma de definir COV_ONasí? Sé que lo que hice arriba está mal, ya que no puedo tener #ifdefdentro #define. ( #no es un personaje permitido en #define). Entonces, ¿hay alguna solución?


1
Todas las respuestas aquí parecen omitir el uso de do {} while(0)(o equivalente) para evitar una declaración vacía; vea mi respuesta en el duplicado vinculado
— Roger Lipscombe

Respuestas:


89

Imposible. Hazlo al revés:


21

Simplemente dale la vuelta:


Gracias por su respuesta. Probé COV_ON (encendido) y COV_ON (apagado) pero luego aparece un error que dice error: esperado ')', casi apagado. Alguna idea sobre el problema.
— agent.smith

son cuerdas. ¿Necesito usarlos como cadenas regulares dentro de la cotización? Como "encendido" y "apagado".
— agent.smith

Depende de su definición de COBERTURA, pero supongo que debe citarlos. Le sugiero que abra otra pregunta para este nuevo número.
— Philip

Lo probé con comillas pero no sirvió de nada. Ya abrí un nuevo hilo. Avíseme si cree que la sintaxis de _Pragma es incorrecta.
— agent.smith

14

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

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

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

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

De acuerdo, ese es un truco útil, pero ¿podemos hacerlo MÁS útil que #ifdefs... la lógica y la configuración booleanas quizás? Configuremos algunas tablas de verdad (y un par de macros auxiliares).

config.h

code.c


Me gusta tu estilo (=
— étale-cohomology

6

6

No se puede. Pero puedes intercambiar #ifdefy #define:


Gracias por su respuesta. Probé COV_ON (encendido) y COV_ON (apagado) pero luego aparece un error que dice error: esperado ')', casi apagado. Alguna idea sobre el problema.
— agent.smith

Sin conocer su compilador, necesitaríamos saber cuál es la _Pragmasintaxis esperada ; ¿cómo lo harías sin una macro?
— sam hocevar

Estoy usando el compilador VC2005 y vi la sintaxis _Pragma en línea. Nunca antes había usado #pragma de esta manera.
— agent.smith

Entonces necesitarás un truco de stringify. Vea esta pregunta y respuesta .
— sam hocevar

Supongo que el problema es VC2005. No usan _Pragma pero usan __pragma. No estoy seguro, pero se ve así. Pero todavía recibo una advertencia de pragma desconocido con __pragma.
— agent.smith

3

Como mencionaste, no es posible tener un #ifdef en un #define. Lo que debería hacer en su lugar es invertir el orden:

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.