J'ai un code comme celui-ci:
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}
};
mais quand je le compile, il dit erreur:
'Hello' variable à la portée du fichier
comment cela pourrait-il arriver? et comment pourrais-je le réparer?
Vous ne pouvez pas avoir de tableau statique dont la taille est donnée sous forme de variable
C'est pourquoi les constantes doivent être #define
ré:
#define a 6
De cette façon, le préprocesseur remplacera a
par 6
, ce qui en fait une déclaration valide.
Réponse simple variable modified array at file scope is not possible
.
Détaillé:
faire compiler le temps integral constant expression
, car la longueur du tableau doit être spécifiée au moment de la compilation.
comme ça :
#define a 6
#define b 3
Ou, suivez la norme c99. et compiler comme pour gcc.
gcc -Wall -std=c99 test.c -o test.out
Le problème ici est que le tableau de longueur variable ne peut pas être initialisé, donc vous obtenez cette erreur.
simplement
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.
}
Maintenant, utilisez for loop ou n'importe quelle boucle pour remplir le tableau.
Pour plus d'informations juste une DEMO:
#include <stdio.h>
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 vous supprimez l'électricité statique et fournissez l'initialisation, cela générera une erreur comme ci-dessus.
Mais si vous gardez statique ainsi que l'initialisation, le reste sera une erreur.
Mais si vous supprimez l'initialisation et conservez static
, l'erreur ci-dessous se produira.
error: variable length array declaration not allowed at file scope
static int Hello[a];
^ ~
1 error generated.
Donc, la déclaration de tableau de longueur variable n'est pas autorisée à la portée du fichier, alors faites-la fonctionner ou bloquez la portée dans n'importe quelle fonction (mais n'oubliez pas que la portée de la fonction doit supprimer l'initialisation)
REMARQUE: étant donné qu'il est C
balisé, faire en sorte que a
et b
en const
ne vous aidera pas mais dans C++
const
fonctionnera bien.
Lorsque vous utilisez CLANG/LLVM, les travaux suivants:
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}
};
(Pour le voir dans l'assembly généré, il faut utiliser Hello pour qu'il ne soit pas optimisé)
Cependant, cela générera une erreur si le mode C99 est sélectionné (-std = c99), il ne générera un avertissement (Wgnu-fold-constant) que si -pedantic est sélectionné.
GCC ne semble pas autoriser cela (const est interprété en lecture seule)
Voir l'explication dans ce fil:
erreur "L'élément d'initialisation n'est pas constant" sans raison dans Linux GCC, compilation de C