web-dev-qa-db-fra.com

Comment compiler un projet C en mode C99?

J'ai reçu le message d'erreur suivant lors de la compilation du code C:

error: 'for' loop initial declarations are only allowed in C99 mode
note: use option -std=c99 or -std=gnu99 to compile your code

Qu'est-ce que ça veut dire?

Comment le réparer?

22
mpluse

Vous avez fait ceci:

for (int i=0;i<10;i++) {

Et vous devez le changer en ceci:

int i;
for (i=0;i<10;i++) {

Ou, comme le dit l'erreur,

utilisez l'option -std = c99 ou -std = gnu99 pour compiler votre code.

Mise à jour copié à partir de la réponse de Ryan Fox :

gcc -std=c99 foo.c -o foo

Ou, si vous utilisez un makefile standard, ajoutez-le à la variable CFLAGS.

32
Blorgbeard

Vous aurez toujours besoin de C99 si vous voulez mélanger des instructions et des déclarations de variables. Comme d'autres réponses et le message d'erreur lui-même le disent, ajoutez -std=c99 à la ligne de commande lorsque vous compilez pour activer les fonctionnalités C99 [1].

Mais vous avez toujours été autorisé à écrire une instruction composée (un "bloc" , IOW, mais la norme n'utilise jamais ce mot!) À la place d'un déclaration unique.

#include<stdio.h>
int main() {
    int i = 5;

    {   /* new block, new declarations. */
        int i;
        for (i=0;i<10;i++){
        }
    }
    printf("%d\n", i);  /* prints "5\n" */
}

C'est légal dans K&R, C90 (aka C89, c'est la même chose), et C99.

L'activation du mode C99 vous donne beaucoup de trucs sympas , mais cela désactive également d'autres trucs sympas que gcc autorise par défaut, comme les structures anonymes et les unions au sein des structures et des unions.

  1. -std=gnu99 active probablement "tous les goodies", mais je vous préviens d'éviter de le faire. Cela rendra la tâche inutile si vous (ou d'autres) souhaitez porter le code. J'aurais probablement une version Windows de mon projet pour animaux de compagnie, portée gratuitement par quelqu'un, si je n'avais pas fait cela. Cela vous lie gcc. Tu ne veux pas être attaché. C'est tout le point sanglant des normes.
6
luser droog

Les autres réponses vous donnent un moyen de contourner le mode par défaut de GCC. Si vous souhaitez utiliser C99, (que je recommande en général), vous devez ajouter cet indicateur de compilation:

gcc -std=c99 foo.c -o foo

Ou, si vous utilisez un makefile standard, ajoutez-le à la variable CFLAGS.

5
Ryan Fox

Cela signifie que vous ne pouvez pas déclarer de variables dans l'instruction for.

Tu devrais faire:

int i ;
for( i = 0 ; i < len ; i++ )

Ce que tu fais probablement

for( int i = 0 ; i < len ; i++ )
2
user1944441