El elemento inicializador no es constante en C

Posible duplicado:
Error “el elemento inicializador no es constante” al intentar inicializar la variable con const

Vengo de javascript / php / python y probablemente me esté perdiendo 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; 

yo obtengo

ex1.4.c: 6: error: el elemento inicializador no es constante
ex1.4.c: 7: error: el elemento inicializador no es constante

Alguien tiene una explicación?

Si está declarando endX como una variable global, el error tiene sentido.

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

Desafortunadamente, en C const variables no son realmente const.

A continuación se presentan los extractos de la norma c99.

6.7.8 Inicialización

  1. Todas las expresiones en un inicializador para un objeto que tenga una duración de almacenamiento estática serán expresiones constantes o cadenas literales .

Las constantes se definen de la siguiente manera:

6.4.4 Constantes

Sintaxis

constante:

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

El estándar define expresiones constantes de la siguiente manera:

6.6 expresiones constantes

(7) Se permite más latitud para expresiones constantes en inicializadores. Dicha expresión constante será, o evaluará, uno de los siguientes:

– una expresión constante aritmética,

– una constante de puntero nula,

– una constante de dirección, o

– una constante de dirección para un tipo de objeto más o menos una expresión constante de entero.

(8) Una expresión constante aritmética tendrá un tipo aritmético y solo tendrá operandos que sean constantes enteras, constantes flotantes, constantes de enumeración, constantes de caracteres y expresiones de tamaño. Los operadores de conversión en una expresión de constante aritmética solo convertirán los tipos aritméticos en tipos aritméticos, excepto como parte de un operando en un operador de tamaño cuyo resultado es una constante entera.

Por lo tanto, c y a no son expresiones constantes y no se pueden usar como inicializadores en su caso.

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

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

Sí, no puedes inicializar algo a una variable. El comstackdor realiza la inicialización y en el momento de la comstackción no conoce el valor de c+a ;

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

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

En los lenguajes de progtwigción en C, los objetos con duración de almacenamiento estático deben inicializarse con expresiones constantes (o agregados 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).