web-dev-qa-db-fra.com

C: pour la déclaration initiale de la boucle int

Quelqu'un peut-il élaborer sur l'erreur gcc suivante?

$ gcc -o Ctutorial/temptable.out temptable.c 
temptable.c: In function ‘main’:
temptable.c:5: error: ‘for’ loop initial declaration used outside C99 mode

temptable.c:

...
/* print Fahrenheit-Celsius Table */
main()
{
    for(int i = 0; i <= 300; i += 20)
    {
        printf("F=%d C=%d\n",i, (i-32) / 9);        
    }
}

P.S: Je me souviens vaguement que int i doit être déclaré avant une boucle for. Je dois dire que je cherche une réponse qui donne un contexte historique de la norme C.

40
Midnight Blue
for (int i = 0; ...) 

est une syntaxe introduite en C99. Pour l'utiliser, vous devez activer le mode C99 en passant -std=c99 (ou une norme ultérieure) à GCC. La version C89 est:

int i;
for (i = 0; ...)

ÉDITER

Historiquement, le langage C obligeait toujours les programmeurs à déclarer toutes les variables au début d'un bloc. Donc quelque chose comme:

{
   printf("%d", 42); 
   int c = 43;  /* <--- compile time error */

doit être réécrit comme:

{
   int c = 43;
   printf("%d", 42);

un bloc est défini comme:

block := '{' declarations statements '}'

C99, C++, C # et Java permet la déclaration de variables n'importe où dans un bloc.

La vraie raison (deviner) est d'allouer des structures internes (comme le calcul de la taille de la pile) dès que possible lors de l'analyse de la source C, sans passer par une autre passe du compilateur.

76
dfa

Avant C99, vous deviez définir les variables locales au début d'un bloc. C99 a importé la fonction C++ qui vous permet de mélanger les définitions de variables locales avec les instructions et vous pouvez définir des variables dans les expressions de contrôle for et while.

12
AProgrammer