J'ai déclaré une variable de cette façon:
int i = 0;
Je reçois l'avertissement:
L'ISO C90 interdit les déclarations mixtes et le code
Comment puis-je le réparer?
Je pense que vous devriez déplacer la déclaration de variable en haut du bloc. C'est à dire.
{
foo();
int i = 0;
bar();
}
à
{
int i = 0;
foo();
bar();
}
Jusqu'au standard C99, toutes les déclarations devaient précéder les déclarations d'un bloc:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99 permettait de mélanger des déclarations et des instructions (comme C++). De nombreux compilateurs utilisent toujours C89 par défaut et certains compilateurs (tels que Microsoft) ne prennent pas en charge C99 du tout.
Donc, vous devrez faire ce qui suit:
Déterminez si votre compilateur prend en charge C99 ou une version ultérieure; si c'est le cas, configurez-le pour qu'il compile C99 au lieu de C89;
Si votre compilateur ne prend pas en charge C99 ou une version ultérieure, vous devrez soit trouver un compilateur différent que ne [] le supporte, soit réécrire votre code afin que toutes les déclarations arrivent avant les instructions du bloc.
Utilisez simplement un compilateur (ou fournissez-lui les arguments dont il a besoin) pour qu'il compile une version plus récente du standard C, C99 ou C11. E.g pour la famille de compilateurs GCC qui serait -std=c99
.
Assurez-vous que la variable se trouve dans la partie supérieure du bloc et si vous la compilez avec -ansi-pedantic
, assurez-vous qu'elle ressemble à ceci:
function() {
int i;
i = 0;
someCode();
}
Pour diagnostiquer ce qui déclenche réellement l'erreur, je commencerai par essayer de supprimer = 0
Si l'erreur est déclenchée, la déclaration va probablement après le code.
S'il n'y a pas d'erreur, cela peut être lié à un indicateur d'application/compilation de norme C OR ... autre chose.
Dans tous les cas, déclarez la variable au début de la portée actuelle. Vous pouvez ensuite l'initialiser séparément. En effet, si cette variable mérite sa propre portée, limitez sa définition dans {}.
Si le PO pouvait clarifier le contexte, une réponse plus ciblée suivrait.
-Wdeclaration-after-statement
exemple reproductible minimal
#!/usr/bin/env bash
set -eux
cat << EOF > main.c
#include <stdio.h>
int main(void) {
puts("hello");
int a = 1;
printf("%d\n", a);
return 0;
}
EOF
# Give warning.
! gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
! gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
! gcc -std=c89 -pedantic -Werror main.c
# Don't give warning.
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c
L'avertissement:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
Testé sur Ubuntu 16.04, GCC 6.4.0.