¿Por qué el comstackdor restringe la variable global para que siempre se inicialice con un valor constante?

Déjame ejemplificar esto,

int a = 100; int b = a; int main(int argc, char **argv, char ** env) { printf("The value of b=%d\r\n",b); return 0; } 

Ahora, me sale el error de comstackción como se esperaba.

 [joshis1@localhost global_var]$ gcc global_var.c -o global_var.out global_var.c:4:1: error: initializer element is not constant int b = a; ^ 

Lo que quiero aprender aquí es por qué me sale el error? ¿Por qué comstackdor restringe esta operación. Entiendo que las variables globales inicializadas se almacenan en segmentos de datos. El comstackdor podría haber resuelto primero el valor de a, y luego podría haber asignado el mismo valor a b. ¿Por qué carece de esta característica? ¿Es complejo para el comstackdor hacer? ¿Hay alguna razón detrás de esta funcionalidad o solo un escollo de C?

La documentación oficial, tomada de la línea 1644, 6.7.8 Inicialización , dice:

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

La razón por la que existe la regla es una pregunta más difícil: tal vez, como sugiere, es difícil para el comstackdor. En C ++, tal expresión es válida, pero el inicializador global puede invocar constructores, etc., mientras que para C, para mantener las cosas compactas, los globales se evalúan en la fase de comstackción. int b = a; es evaluable en tiempo de comstackción, pero ¿qué pasa con int b = a + c; ? int b = pow(a, 2); ? ¿Dónde te detendrías? C decide que no permitir que empieces es la mejor solución.

De tu comentario:

… ¿cómo puedo forzar al comstackdor a hacer este trabajo?

Bueno, no puede hacer que el comstackdor acepte lo que tiene, pero puede lograr su objective definiendo el valor que desea asignar a ambas variables.

 #define INITIAL_VALUE_FOR_A 100 int a = INITIAL_VALUE_FOR_A; int b = INITIAL_VALUE_FOR_A; 

Ahora, si necesita cambiar el valor inicial, solo necesita cambiarlo en un lugar;

C es portátil a máquinas muy simples, pequeñas. La evaluación de expresiones que no son constantes requiere un código de tiempo de ejecución, en una función. En la progtwigción integrada, es posible que no desee ninguna función (o código) que no haya progtwigdo explícitamente.

Su comstackdor probablemente evaluará el inicializador como una extensión de idioma, si está configurado con diferentes opciones. Si eso falla, puedes probar C ++ (incluso solo el subconjunto tipo C) u otro idioma que haga más cosas que te gustan: v).

Otros han declarado por qué los inicializadores en general no pueden ser expresiones arbitrarias.

La forma de ” forzar al comstackdor a aceptar el código ” es cambiar el código . La forma canónica de realizar una inicialización arbitraria de las variables de enlace externo (vulgo: “global”) del scope del archivo es llamar una función de inicialización al inicio de main () que realiza toda la inicialización en la secuencia que necesita:

 #include  int a; int b; void init(void) { a = 100; b = a; } int main(int argc, char **argv) { init(); printf("The value of b=%d\n", b); return 0; }