2013-04-08 2 views
18

я получил следующее сообщение об ошибке при компиляции кода C:Как скомпилировать проект C в режиме C99?

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

Что это значит?

Как это исправить?

+1

Ну, может быть, показ кода будет хорошим началом. – OldProgrammer

+1

Вывести инициализацию из цикла for. – Mysticial

+8

Компилятор говорит, как исправить это в сообщении об ошибке. – chris

ответ

28

Вы сделали это:

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

И вы должны изменить его к этому:

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

Или, как говорит об ошибке,

использование опции -std = c99 или -std = gnu99, чтобы скомпилировать ваш код.

Updateскопирована с ответом Райана Фокса:

gcc -std=c99 foo.c -o foo 

Или, если вы используете стандартный Makefile, добавить его в переменную CFLAGS.

2

Это означает, что вы не можете объявлять переменные в инструкции for.

Вы должны сделать:

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

То, что вы, вероятно, делает

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

Другие ответы дают вам работу вокруг, чтобы иметь дело с режимом GCC по умолчанию. Если вы хотите использовать C99, (который я рекомендую вообще), то вы должны добавить, что флаг компилятора:

gcc -std=c99 foo.c -o foo 

Или, если вы используете стандартный Makefile, добавьте его в переменную CFLAGS ,

6

Вам все равно потребуется C99, если вы хотите смешивать утверждения и объявления переменных. Как и другие ответы и само сообщение об ошибке, добавьте -std=c99 в командную строку при компиляции, чтобы включить функции C99 [1].

Но вам всегда разрешалось писать составной оператор («блок», IOW, но стандарт никогда не использует это слово!) Вместо одного утверждения.

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

Это законно в K & R, C90 (ака C89, это то же самое), и C99.

Включение режима C99 дает вам много cool stuff, но также отключает другие интересные материалы, которые gcc разрешает по умолчанию, например анонимные структуры и объединения внутри структур и объединений.

  1. -std=gnu99, вероятно, включает в себя «все лакомства», но я предостерегаю вас, чтобы этого не делалось.Это сделает ненужные трудности, если вы (или другие) захотите перенести код. У меня, вероятно, была бы версия для Windows моего проекта для животных, которую кто-то мог бесплатно портировать, если бы я не сделал этого. Он связывает вас gcc. Вы не хотите быть привязанным. Это целая черта стандартов.
+0

В своем сообщении вы упоминаете 'C90'. В чем разница между 'C89' и' C90'? Например; 'Раздел 3.3.3' книги' Введение в GCC' дает '-std = c89',' -std = iso9899' и '-std = c99'. Я не видел «C90». –

+1

Комитет ANSI принял первый стандарт C в 1989 году. Комитет ИСО принял тот же стандарт в 1990 году. Это то же самое. –

+1

Да. Первоначальный комитет ANSI очень усердно работал над тем, чтобы стандарт был готов для международного сообщества. Было внесено несколько изменений, внесенных комитетом ИСО, но затем комитет ANSI принял изменения. Так что они точно такие же. Таким образом, да, их можно использовать взаимозаменяемо (но будьте готовы объяснить, что они одинаковы, если кто-то запутался! :). –

Смежные вопросы