2012-10-05 28 views
13

Possible Duplicate:
Error “initializer element is not constant” when trying to initialize variable with constelemento inicializador no es constante en C

estoy procedentes de JavaScript/PHP/Python y probablemente me falta algo, aquí está el código:

const int a = 50; 
const int c = 100; 
const int d = 100; 
int endX = c + a; 
int endY = d; 
int startX, startY, b; 

me sale

ex1.4.c:6: error: initializer element is not constant
ex1.4.c:7: error: initializer element is not constant

Alguien tiene una explicación?

+1

mirada en el panel de la derecha de esta pregunta a este se ha hecho muchas veces antes. Por favor, busca en este sitio antes de preguntar. –

+0

Puedo compilar su código muy bien. ¿Qué compilador/sistema estás usando? – none

+0

@gokcehan: ¿estás usando un compilador C++, por casualidad? –

Respuesta

4

Si declara endX como una variable global, el error tiene sentido.

La razón es que las variables globales se inicializan en tiempo de compilación, y está intentando inicializar endX como una operación que debe realizarse en tiempo de ejecución.

+4

-1. Esta respuesta es incorrecta No hay nada que impida que el compilador compute endX antes del tiempo de ejecución. De hecho, g ++ compilará esto felizmente. Es solo que GCC está demasiado irritable sobre lo que aceptará. – weberc2

2

Sí, no se puede inicializar algo en una variable. El compilador realiza la inicialización y en el momento de la compilación no conoce el valor de c+a;

La inicialización de tipo int x = 1; está bien, el compilador simplemente pone un 1 en la dirección de x en el código del objeto.

Para inicializar algo en c+a, desea hacerlo en tiempo de ejecución, en el código de inicio en c o constructor en C++.

0

En los lenguajes de programación C, los objetos con duración de almacenamiento estático deben inicializarse con expresiones constantes (o agregadas que contengan expresiones constantes). Si endX tiene una duración de almacenamiento estático, su inicializador (c+a) no es una expresión constante (es decir, la expresión no se puede evaluar durante la fase de traducción).

15

Desafortunadamente, en C const las variables no son realmente const.

A continuación se muestran los extractos del estándar c99.

6.7.8 Initialization

  1. All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

Las constantes se definen como sigue:

6.4.4 Constants

Syntax

constant:

integer-constant  (e.g. 4, 42L) 
floating-constant  (e.g. 0.345, .7) 
enumeration-constant (stuff in enums) 
character-constant  (e.g. 'c', '\0') 

La norma define expresiones constantes como sigue:

6.6 Constant expressions

(7) More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:

— an arithmetic constant expression,

— a null pointer constant,

— an address constant, or

— an address constant for an object type plus or minus an integer constant expression.

(8) An arithmetic constant expression shall have arithmetic type and shall only have operands that are integer constants, floating constants, enumeration constants, character constants, and sizeof expressions. Cast operators in an arithmetic constant expression shall only convert arithmetic types to arithmetic types, except as part of an operand to a sizeof operator whose result is an integer constant.

Por lo tanto, c y a no son expresiones constante y no se puede utilizar como inicializadores en tu caso.

5

const expresiones deben ser una constante de tiempo de compilación en C a diferencia de C++, por lo tanto c+a no se puede utilizar como una constante. La forma habitual de manejar este problema en C es utilizar el preprocesador lugar:

#define A 50 
#define C 100 
#define D 100 
int endX = C + A; 
int endY = D; 
int startX, startY, b; 
+1

si 'c' y' a' son constantes de tiempo de compilación, entonces 'c + a' también (y todo aquello a lo que se le asigna esa expresión). No es que C++ no requiera que las expresiones const sean constantes en tiempo de compilación; es que C++ es lo suficientemente inteligente como para darse cuenta de que 'const int + const int' es una constante de tiempo de compilación, mientras que C no es tan inteligente. – weberc2

Cuestiones relacionadas