ISO C90 interdit mixte déclarations et le code en C
J'ai déclaré une variable de cette façon:
int i = 0;
- Je obtenir de l'avertissement:
ISO C90 interdit mixte déclarations et le code
Comment puis-je résoudre ce problème?
- Ça sonne comme du CCG
-pedantic
ou-std=c89
, dans ce cas, vous pouvez compiler avec-std=gnu99
si vous le souhaitez. - Si vous utilisez gcc, vous pouvez indiquer l'utilisation du C99 qui permet mixte déclarations et le code (drapeau
-std=c99
). - Une option serait d'arrêter la compilation d'une norme de 22 ans dont le remplacement a été remplacé.
- Pour répondre à votre commentaire dans ma réponse (maintenant supprimé): non, C99 a en effet introduit mêlé déclarations: la déclaration de la variable n'est plus limité à la portée du fichier ou le début d'une instruction composée (bloc). Je me demande, cependant, pourquoi devez-vous utiliser C90-compilateur?
- s'il vous plaît dites Microsoft qui. 🙂
- Microsoft n'a aucun intérêt dans l'expédition d'un compilateur C; qui ne changera probablement pas. Heureusement, il existe un certain nombre de très bonnes compilateurs ciblant la plate-forme fournie par d'autres fournisseurs.
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devez déplacer la déclaration de variable dessus du bloc. I. e.
à
{foo(); {int i=0; bar();}}
Jusqu'le standard C99, toutes les déclarations devait venir avant tout des instructions dans un bloc:
C99 autorisé pour le mélange des déclarations et (comme C++). De nombreux compilateurs encore défaut à C89, et certains compilateurs (comme Microsoft) ne supportent pas C99 à tous les.
Donc, vous devez effectuer les opérations suivantes:
Déterminer si votre compilateur prend en charge le C99 ou plus tard; si elle le fait, la configurer pour qu'il compile le C99 au lieu de C89;
Si votre compilateur ne supporte pas C99 ou tard, vous devrez soit trouver un autre compilateur que ne de soutien, ou de réécrire votre code de façon à ce que toutes les déclarations passer avant les instructions à l'intérieur du bloc.
Il suffit d'utiliser un compilateur (ou de lui fournir les arguments dont elle a besoin) tel qu'il compile une version plus récente de la norme C C99 ou C11. E. g pour la famille des compilateurs GCC qui serait
-std=c99
.-std=gnu89
est utilisé lors de la compilation de modules du noyau linux.Assurez-vous que la variable est sur la partie supérieure du bloc, et dans le cas où vous le compiler avec
-ansi-pedantic
, assurez-vous qu'il ressemble à ceci:À diagnostiquer ce vraiment déclenche l'erreur, je voudrais d'abord essayer de supprimer
= 0
Si l'erreur est déclenché, il est alors probable que la déclaration va après le code.
Si pas d'erreur, alors il peut être lié à un C-exécution standard/compiler flags OU ...autre chose.
Dans tous les cas, la déclaration de la variable dans le début de la portée actuelle. Vous pouvez ensuite l'initialiser séparément. En effet, si cette variable mérite son propre champ - de délimiter sa définition dans les {}.
Si les OP pourraient préciser le contexte, puis plus de réponse dirigée à suivre.
-Wdeclaration-after-statement
minimale reproductible exempleL'avertissement:
Testé sur Ubuntu 16.04, GCC 6.4.0.