2013-04-08 18 views
18

mam następujący komunikat o błędzie podczas kompilacji kodu C:Jak skompilować projekt C w trybie C99?

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

Co to oznacza?

Jak to naprawić?

+1

Cóż, może pokazanie kodu byłoby dobrym początkiem. – OldProgrammer

+1

Wyciągnij inicjalizację z pętli for. – Mysticial

+8

Kompilator mówi, jak to naprawić w komunikacie o błędzie. – chris

Odpowiedz

28

Zrobiliście to:

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

i trzeba go zmienić na to:

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

Lub, jak mówi o błędzie,

użycie opcji -std = c99 lub -std = gnu99, aby skompilować swój kod.

Aktualizacjaskopiowane z Ryan Fox odpowiedź:

gcc -std=c99 foo.c -o foo 

Lub, jeśli używasz standardowego makefile, dodaj go do zmiennej CFLAGS.

2

Oznacza to, że nie można zadeklarować zmiennych w oświadczeniu for.

należy zrobić:

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

Co jesteś prawdopodobnie robi

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

innych odpowiedzi daje pracę około do czynienia z trybem domyślnym GCC. Jeśli chcesz korzystać z C99 (który ja nie polecam w ogóle) to trzeba dodać, że flagi kompilatora:

gcc -std=c99 foo.c -o foo 

Lub, jeśli używasz standardowego makefile, dodaj go do zmiennej CFLAGS .

6

Będziesz nadal potrzebował C99, jeśli chcesz mieszać wyciągi i deklaracje zmiennych. Podobnie jak inne odpowiedzi i sam komunikat o błędzie, dodaj -std=c99 do wiersza poleceń, gdy kompilujesz, aby włączyć funkcje C99 [1].

Ale zawsze można było pisać złożoną instrukcję ("blok", IOW, ale standard nigdy nie używa tego słowa!) Zamiast pojedynczego zdania.

#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" */ 
} 

To jest legalne w K & R, C90 (aka C89, to jest to samo), i C99.

Włączenie trybu C99 powoduje, że uzyskujesz dużą liczbę cool stuff, ale wyłącza również inne fajne rzeczy, które domyślnie gcc pozwala, takie jak anonimowe struktury i związki w strukturach i związkach.

  1. -std=gnu99 prawdopodobnie pozwala „cały bajerów”, ale ostrożnie, aby uniknąć w ten sposób.Będzie to niepotrzebne utrudnienie, jeśli ty lub inni chcecie przenieść kod. Prawdopodobnie miałbym wersję okienkową mojego projektu dla zwierząt domowych, przeniesioną za darmo przez kogoś, gdybym tego nie zrobił. To wiąże cię z GCC. Nie chcesz być związany. To cały cholerny punkt standardów.
+0

W swoim wpisie wspominasz o "C90". Jaka jest różnica między 'C89' a' C90'? Na przykład; 'Rozdział 3.3.3' książki' Wprowadzenie do GCC' podaje '-std = c89',' -std = iso9899' oraz '-std = c99'. Nie widziałem "C90". –

+1

Komitet ANSI przyjął pierwszy standard C. w 1989 roku. Komitet ISO przyjął ten sam standard w 1990 roku. To jest to samo. –

+1

Tak. Pierwotny komitet ANSI bardzo się starał, aby standard był gotowy dla społeczności międzynarodowej. Dokonano tylko kilku zmian, które komitet ISO wydał, ale potem komisja ANSI przyjęła zmiany. Więc są dokładnie tacy sami. Tak więc, mogą być używane zamiennie (ale bądźcie gotowi wyjaśnić, że są tacy sami, jeśli ktoś jest zdezorientowany! :). –

Powiązane problemy