¿Se pueden anidar las directivas de preprocesador #if en C ++?


84

Tengo una pregunta sobre las directivas de preprocesador en c ++:

Por ejemplo:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

¿Podemos usarlo de esta manera y el compilador de C ++ puede coincidir con ifndefy endifde la manera correcta?


1
Puede anidar condicionales y puede llamar una macro desde otra, pero no puede anidar macros directamente, por ejemplo #define AAA #define XXX, no funcionará correctamente.
SF.

2
Dado que una pregunta de C acaba de cerrarse como un duplicado de esta, señalaré que las reglas para el preprocesador de C y C ++ son las mismas, al menos en lo que respecta a esta pregunta.
Keith Thompson

Respuestas:


112

Si podemos. La #endifdeclaración coincide con la anterior #if #ifdefo #ifndefetc. para la que no ha habido una correspondencia #endif.

p.ej

#if  ----------|
#if  -----|    |
#endif ---|    |
#endif --------|

tenemos dos #endif aquí, así que el primer #endif coincidirá con el segundo #ifndef?

No coincidirá con el anterior; eso significaría que no podríamos anidarlos.
Fred Foo

49

Sí, puede anidar #if/ #endifbloques. Algunos estilos de codificación C le dirían que escriba

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

usando espacios para denotar el nivel de anidamiento.


5
+1 para el bit de anidamiento, a veces ayuda mucho con la claridad.
André Caron

¿Por qué insertarías espacio? ¿Por qué no simplemente #ifdef
aplicar

3
Ni siquiera sabía #que se permitían espacios entre las directivas del preprocesador. ¡Muchas gracias por ese consejo!
AlexR

0

En su código, la sección #ifndef PREGUNTA se descartará a menos que #undef PREGUNTA.

¡Buena suerte!


Lo siento, leyó mal el código de muestra. Pensé que comenzaba con #ifdef PREGUNTA
bert-jan
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.