2010-02-23 10 views
10

tengo esto:¿Por qué no puedo usar sizeof() en un #if?

#if sizeof(int) 
    #error Can't use sizeof in a #if 
#endif 

consigo este error del compilador:

missing binary operator before token "(" 

Por qué no puedo utilizar el operador sizeof aquí?

+2

Esto tiene b een preguntado muchas veces. Solo haz una búsqueda. Aquí hay una respuesta, por ejemplo, http://stackoverflow.com/questions/1717665/c-throwing-compilation-error-on-sizeof-comparison-in-preprocessor-if – AnT

+0

Creo que estás buscando LISP o Scheme :) – leppie

Respuesta

12

Porque sizeof() se calcula después de ejecutar el preprocesador, por lo que la información no está disponible para #if.

Los compiladores C se dividen lógicamente en dos fases, incluso si la mayoría de los compiladores modernos no los separan. Primero, la fuente es preprocesada. Esto implica trabajar y sustituir todos los condicionales del preprocesador (#if, #define, reemplazando palabras definidas con sus reemplazos). La fuente se pasa, procesa, al compilador. El preprocesador solo es mínimamente consciente de la estructura de C, no tiene ningún tipo de conocimiento, por lo que no puede manejar construcciones de compilación como sizeof().

2

Porque solo puede usar constantes literales en una directiva de preprocesador. Además, sizeof (int) siempre es mayor que 0, así que creo que este #if sería cierto todo el tiempo de todos modos.

+0

Eso fue un mal ejemplo de mi parte. Estaba tratando de quitar todos los detalles específicos de mi proyecto y se me ocurrió este ejemplo. – Robert

+1

No es estrictamente cierto: puede hacer operaciones booleanas y hay algunas llamadas similares a funciones ('defined()'). Algunos preprocesadores permiten una gran cantidad de cosas adicionales (he visto a personas pidiendo operadores de registro en el preprocesador, porque los habían usado con un compilador integrado). –

0

La #if es una directiva de preprocesador.
sizeof() es un operador C y se calcula en tiempo de compilación.

En el momento del preprocesador (cuando se maneja el #if), los operadores C no se ejecutan.

+0

'sizeof' no es una función de biblioteca, es un operador. – avakar

+0

No es estrictamente cierto: sizeof() es una función de idioma, no una función de biblioteca. Además de alguna hechicería específica de C99, se evalúa en tiempo de compilación. –

+0

Gracias por el comentario sobre sizeof ser un operador ... solucionado mi respuesta. –

-3

Considere:

#if sizeof(MyClass) > 3 
    #define MY_CONSTRAINT 2 
#endif 

class MyClass 
{ 
    #if MY_CONSTRAINT == 3 
     int myMember = 3; 
    #endif 
}; 

Ahora, esto se prolly no está escrito en la sintaxis correcta, ya que ha pasado un tiempo desde la última vez que lo hice C++, pero el punto sigue en pie :)

+0

¿Cuál es tu punto? – Ponkadoodle

+2

Mirando hacia atrás, realmente no sé :) – cwap

+0

jaja, aprecio la honestidad: P Me alegro de que no interpretó mi comentario como hostil. – Ponkadoodle

-3

sólo tiene que utilizar ordinario si-else

if  (sizeof(x)==2) {...} 
else if (sizeof(x)==4) {...} 
else     {...} 

y el compilador optimizará en tiempo de compilación ...

+0

todo el punto es declaraciones de tiempo de compilación. – vitiral

Cuestiones relacionadas