variable tableau modifié à la portée de fichier en C
J'ai un code comme ceci:
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 compile, il est dit d'erreur:
variable modifiée "Bonjour" à la portée du fichier
comment est-ce possible? et comment pourrais-je résoudre ce problème?
Double Possible de Variable tableau modifié à la portée de fichier
OriginalL'auteur | 2012-11-30
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir statique tableau dont la taille est donnée comme une variable
C'est pourquoi les constantes doivent être
#define
d:Cette façon de préprocesseur va remplacer
a
avec6
, le rendre valide déclaration.Non, ce sera encore une variable. Utilisation
#define
. En C++ il y aconst
qui permettraitconst int a = 6;
de travail, mais mêmeconst
n'est pas assez en C.Pas sûr au sujet de la norme, mais gcc ne l'accepte pas.
Mes excuses. Vous avez tout à fait raison au sujet de gcc. Mon commutateurs sont sur "std=gnu99". En vertu de l' "std=c99" vous ne pouvez même pas const-decl les dimensions. Vous obtenez les deux mon-voter, ma réponse supprimé, et mes excuses, monsieur.
OriginalL'auteur zch
Réponse Simple
variable modified array at file scope is not possible
.Détaillée :
faire de la compilation
integral constant expression
, puisque la longueur du tableau doit être spécifié au moment de la compilation.comme ceci :
Ou, suivez standard c99. et de la compilation comme pour gcc.
gcc -Wall -std=c99 test.c -o test.out
Le problème ici est de longueur variable tableau à la fourniture de longueur ne peut pas être initialisé, donc vous obtenez cette erreur.
simplement
Maintenant utiliser la boucle for ou une boucle pour remplir le tableau.
Pour plus d'info, juste une DÉMO :
Si vous éliminer l'électricité statique et de fournir l'initialisation il va générer d'erreur comme ci-dessus.
Mais si vous gardez statique ainsi que l'initialisation de l'faudra encore une erreur.
Mais si vous retirez de l'initialisation et de garder
static
l'erreur ci-dessous viendra.Afin de longueur variable déclaration de tableau non autorisé à la portée du fichier afin de le faire fonctionner ou de bloquer la portée à l'intérieur de n'importe quelle fonction (mais rappelez-vous rendant à la portée de la fonction doit supprimer l'initialisation)
NOTE : Depuis qu'il est
C
marqués afin de fairea
etb
commeconst
ne vous aidera pas, mais dansC++
const
fonctionnera très bien.static const int a = 10;
par exemple, à la portée de fichier.Vraiment ? laissez-moi vérifier
Ses une pile-chose. Si ils sont encore pris en charge par votre compilateur C99, il n'est pas obligatoire qu'ils soient; la norme définit comment ils se comportent si votre C99 t les soutenir. Les implémentations de l'utilisation de la pile-mathématiques pour les mettre en œuvre. Vous ne pouvez pas le faire au niveau mondial (ou fichier) de données du segment de la compilation.
Mais quand je définis
a
dansmain
dans ce cas, ce n'est pas le travail, la compilation avec-std=c99
. maintenanta
est sur la pile, donc quel est le problème maintenant , j'ai essayé avecgcc
etclang
J'ai lu quelque part sur DONC en lui même posté la réponse , mais je suis maintenant moi-même face à cette avec
-std=c99
et pas à la compilation, aucune idée ? allez éditer ma réponse aussiOriginalL'auteur Omkant
Lors de l'utilisation de CLANG/LLVM les ouvrages suivants:
(À voir dans l'assembly généré, on doit utiliser Bonjour, de sorte qu'il ne sera pas optimisé)
Cependant, cela va générer une erreur si C99 mode est sélectionné (-std=c99),
il ne fera que générer un avertissement (Wgnu-pliage-constant) si -pédant est sélectionné.
GCC ne semble pas permettre cela (const est interprétée comme étant en lecture seule)
Voir l'explication dans ce fil:
"Initialiseur élément n'est pas constante d'erreur" pour aucune raison en Linux, GCC, la compilation de C
OriginalL'auteur PolarBear2015