conjunto variable modificado en el scope del archivo en C

Tengo un código como este:

static int a = 6; static int b = 3; static int Hello[a][b] = { { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3} }; 

pero cuando lo compilo, dice error:

“Hola” modificado de forma variable en el scope del archivo

¿Cómo pudo pasar esto? y ¿cómo podría solucionarlo?

No puede tener una matriz estática cuyo tamaño se da como una variable

Es por eso que las constantes deben ser #define d:

 #define a 6 

De esta manera, el preprocesador reemplazará a por 6 , lo que lo convierte en una statement válida.

La variable modified array at file scope is not possible respuesta simple variable modified array at file scope is not possible .

Detallado :

hacer que compile la integral constant expression tiempo, ya que la longitud de la matriz debe especificarse en el tiempo de comstackción.

Me gusta esto :

 #define a 6 #define b 3 

O bien, siga el estándar c99. y comstackr como para gcc.

gcc -Wall -std=c99 test.c -o test.out

El problema aquí es que la matriz de longitud variable con la longitud proporcionada no se puede inicializar, por lo que está obteniendo este error.

simplemente

 static int a =6; static int b =3; void any_func() { int Hello [a][b]; // no need of initialization no static array means no file scope. } 

Ahora usa for loop o cualquier loop para llenar la matriz.

Para más información solo una DEMO:

 #include  static int a = 6; int main() { int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello it's in function //scope but still error return 0; } root@Omkant:~/c# clang -std=c99 vararr.c -o vararr vararr.c:8:11: error: variable-sized object may not be initialized int Hello[a]={1,2,3,4,5,6}; ^ 1 error generated. 

Si elimina la estática y proporciona la inicialización, generará un error como el anterior.

Pero si mantienes la estática y la inicialización, el silencio será un error.

Pero si elimina la inicialización y mantiene la static aparecerá el siguiente error.

 error: variable length array declaration not allowed at file scope static int Hello[a]; ^ ~ 1 error generated. 

Por lo tanto, la statement de matriz de longitud variable no está permitida en el scope del archivo, por lo tanto, haga que funcione o bloquee el scope dentro de cualquier función (pero recuerde que al hacer que el scope de la función deba eliminar la inicialización)

NOTA: Dado que está etiquetado en C hacer a y b como const no lo ayudará, pero en C++ const funcionará bien.

Al usar CLANG / LLVM, lo siguiente funciona:

 static const int a = 6; static const int b = 3; static int Hello[a][b] = { { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3} }; 

(Para verlo en el ensamblaje generado, uno necesita usar Hello para que no se optimice)

Sin embargo, esto generará un error si se selecciona el modo C99 (-std = c99), solo generará una advertencia (Wgnu-folding-constant) si se selecciona -endántico.

GCC no parece permitir esto (const se interpreta como de solo lectura)

Ver explicación en este hilo:

El error “El elemento inicializador no es constante” sin ninguna razón en Linux GCC, comstackndo C