2011-05-27 19 views
7

Duplicar posibles:
C preprocessor: using #if inside #define?instrucciones de preprocesador dentro definen?

¿Hay algún truco para tener directivas del preprocesador en el interior del lado derecho de definir? El problema es que el preprocesador dobla todos los rhs en una línea larga. Pero tal vez hay un truco?

Ejemplo de lo que yo quiero en los RHS es

#define MY_CHECK \ 
    #ifndef MY_DEF \ 
    # error MY_DEF not defined \ 
    #endif 

?
El propósito es una brevedad: tener un atajo de una línea en lugar de una secuencia de controles de varias líneas.

Respuesta

9

Como han notado otros, las macros de preprocesador no pueden expandirse a ninguna otra directiva de preprocesador; si lo hacen, generalmente obtendrán errores extraños sobre los caracteres "#" extraviados en la entrada. Sin embargo, a veces hay cosas que puede hacer para obtener lo que quiere. Si desea que una macro que se expande a algo como:

#ifdef SOMETHING 
...some code... 
#endif 

donde algún código no incluye ninguna directivas del preprocesador, se puede definir una macro IFDEF:

#ifdef SOMETHING 
#define IFDEF_SOMETHING(X) X 
#else 
#define IFDEF_SOMETHING(X) 
#endif 

y luego usar en IFDEF_SOMETHING(...some code...) tu otra macro.

Si tiene un montón de procesado de preprocesador que desea repetir varias veces, puede pegarlo en su propio archivo y luego usar #include "stuff" en cada lugar que lo necesite.

+0

... _algunos código_ es mejor que no tengan comas tampoco. –

+0

@John: sí, aunque con C99 puede usar '...'/'__VA_ARGS__' para evitar ese problema –

+0

poniendo la secuencia de las directivas de preprocesador en un archivo .h por separado e incluirlo es una buena idea. – Andrei

2

Suponiendo un preprocesador como el GNU C Preprocessor, entonces no. The manual says:

El compilador no vuelve a tokenize salida del preprocesador. Cada token de preprocesamiento se convierte en un token de compilación.

4

No funcionará (§6.10.3.4/3: "El resultante completamente-macro reemplazado preprocesamiento secuencia de tokens no se procesa como una directiva de preprocesamiento incluso si se asemeja a uno ...").

Si realmente quiere hacer cosas como esta, puede ejecutar su fuente a través de algo así como m4 antes de la compilación - pero por lo general recomiendo en contra de ella.

Cuestiones relacionadas