2009-10-23 3 views
13

Entiendo que sizeof es un operador, que se evalúa en tiempo de compilación a una constante entera. Pero parece que no se puede utilizar en la directiva de preprocesador #if como:¿Por qué no puedo usar sizeof en una condición de preprocesador?

#if 4 == sizeof(int) 
    typedef int Int32; 
#endif 

(cygwin-gcc 3.4.4, así como Visual C++ 6.0 informe de errores de compilación)

Por qué no es tal uso ¿permitido?

Respuesta

19

Debido sizeof se evalúa en tiempo de compilación, mientras que las directivas se evalúan antes compilación, y la parte que hace que no es el compilador, por lo que no va a entender lo sizeof medios.

+1

En realidad, el preprocesamiento ocurre durante la compilación, solo en una de las fases anteriores. La evaluación de 'sizeof 'ocurre en una fase posterior. – sbi

+4

@sbi El preproceso no forma parte de la compilación; el compilador normalmente ejecuta el preprocesador antes de la compilación real, pero puede indicar al compilador que no lo haga. La respuesta de RichN es 100% correcta. – qrdl

+0

Bueno, estaba equivocado, pero solo en terminología: es una de las fases de _translation_. De acuerdo con este http://stackoverflow.com/questions/1476892/1479972#1479972, tampoco existe una fase llamada "compilación", entonces, ¿qué significa eso que parece estar abierto a la interpretación? – sbi

10

El sizeof es un operador en C. No puede usar el código C en las directivas de preprocesador. Las directivas de preprocesador se evalúan antes de que tenga lugar la compilación.

+0

¡Tienes la primera! –

+0

"==" también es un operador. La respuesta de RichN señala el problema un poco más claro para mí. – felix0322

+2

@ felix0322: el preprocesador tiene su propio operador '==', que es el que se usa en las directivas de preprocesador. – sbi

Cuestiones relacionadas