2009-01-19 14 views
10

¿Por qué el compilador me da el siguiente mensaje de error en el código proporcionado: "elemento de inicializador no es constante". El código C/C++ correspondiente se compila perfectamente bajo gcc.Error de Objective-C: elemento de inicializador no es constante

#import <Foundation/Foundation.h> 

const float a = 1; 
const float b = a + a; // <- error here 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // insert code here... 
    NSLog(@"Hello, World!"); 
    [pool drain]; 
    return 0; 
} 
+0

usted sabe que el Objetivo-c se compila bajo gcc así? – hhafez

+0

Puede eliminar todas las cosas de Objective-C y compilar esto como C y obtendrá el mismo error. – Chuck

+2

Pero también puede eliminar todas las cosas de Objective-C, guardar en el archivo main.c y compilar con gcc main.c y funcionará como se espera. (al menos funciona para mí) –

Respuesta

12

Ese código sólo se compilará correctamente si los const float declaraciones aparecen en algún lugar que no sea el ámbito de archivo.

Es parte del estándar, aparentemente. Es importante que todas las variables declaradas de alcance de archivo se inicialicen con expresiones constantes, no expresiones que involucren variables constantes.

Está inicializando el flotador 'b' con el valor de otro objeto. El valor de cualquier objeto, incluso si se trata de un cualificado const, no es una expresión constante en C.

+0

¿Puedes explicar por qué? Gracias estoy interesado – hhafez

+2

@hhafez - En este caso 'b' no se inicializa con otro objeto, sino con otra primitiva. Sin embargo, ambos se declaran como 'const', y 'b' depende del valor de 'a', que es ilegal según el estándar. –

+0

¿Puedes explicar que la parte "solo compilará correctamente si las sentencias const float aparecen en algún lugar que no sea el alcance del archivo"? Qué significa eso? – Olie

1

no tengo Xcode en mi máquina aquí, así que no puedo probar mi ejemplo,

Pero puede intentar

#define A (1) 
#define B (A + A) 

const float a = A; 
const float b = B; 
+0

su segunda solución daría el mismo error ... no puede simplemente convertir una variable para que sea literal. –

+0

eliminó mi segunda solución (solo dejó la primera) – hhafez

+3

Tenga en cuenta que las expresiones #define son "directivas de preprocesador", lo que significa que se reemplazan en el código antes de que el compilador lo intente. Si esto funciona, es porque obtienes "const float a = (1);" y "const float b = ((1) + (1));" en tiempo de compilación Bastante inútil en general. –

4

@dreamlax es correcto, no se puede tener una declaración const cuya inicialización depende de otra variable (const). Si necesita uno para depender del otro, sugiero crear una variable que pueda tratar como una constante e inicializarla solo una vez. Ver estas preguntas SO para más detalles:

Cuestiones relacionadas