web-dev-qa-db-fra.com

ISO C90 interdit les déclarations mixtes et le code en C

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?

57
user707549

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();
}
91
Johan Kotlinski

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:

  1. 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;

  2. 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. 

26
John Bode

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.

10
Jens Gustedt

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();
}
3
Ron Nuni

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.

2
vmsnomad

-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.