Как исправить ошибку GCC «для начального объявления цикла, используемого вне режима C99»?


117

Я пытаюсь решить проблему 3n + 1, и у меня есть forцикл, который выглядит так:

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

К сожалению, я получаю эту ошибку, когда пытаюсь скомпилировать с GCC:

3np1.c: 15: error: начальное объявление цикла for, используемое вне режима C99

Я не знаю, что такое режим C99. Любые идеи?

Ответы:


149

Я бы попробовал объявить iвне цикла!

Удачи в решении 3n + 1 :-)

Вот пример:

#include <stdio.h>

int main() {

   int i;

   /* for loop execution */
   for (i = 10; i < 20; i++) {
       printf("i: %d\n", i);
   }   

   return 0;
}

Подробнее о циклах в C читайте здесь .


тогда почему бы вам не использовать вместо этого цикл while?
Erik W

3
@ErikW, ваш вопрос очень плохой
user25

119

Есть переключатель компилятора, который включает режим C99 , который, помимо прочего, позволяет объявлять переменную внутри цикла for. Чтобы включить его, используйте переключатель компилятора-std=c99

Или, как говорит @OysterD, объявите переменную вне цикла.


7
на самом деле -std = gnu99, вероятно, более желателен, так как таким образом вы по-прежнему получаете расширения gcc (по умолчанию gcc имеет значение -std = gnu89, однако в какой-то момент в следующих нескольких версиях это будет изменено на gnu99)
Spudd86

4
@ Spudd86: Если вы хотите , чтобы включить расширения GCC зависит от того, что вы делаете. Отключение их полезно, если ваша цель - написать код, переносимый для компиляторов, отличных от gcc.
Кейт Томпсон

21

Чтобы переключиться в режим C99 в CodeBlocks , выполните следующие действия:

Нажмите « Параметры проекта / сборки» , затем на вкладке « Параметры компилятора» выберите вложенную вкладку « Другие параметры» , поместите ее -std=c99в текстовую область и нажмите « ОК». .

Это превратится C99 режим для вашего компилятора.

Надеюсь, это кому-то поможет!


Это помогло в кодовых блоках 16.1 в разделе « Другой компилятор» ! Хотя я использовал, -std=gnu99как показано в некоторых ответах выше!
Анкур Шах

Но это помогло временно! Мне приходится делать это каждый раз, когда я компилирую код! ... :(
Анкур Шах

Нет, нет! Это нужно делать для каждого нового проекта только один раз.
akelec

14

Я тоже получил эту ошибку.

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

не действует в стандарте C89 / C90. Как говорит OysterD, вам нужно сделать:

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

Ваш исходный код допускается в C99 и более поздних стандартах языка C.


3
Для gcc укажите "-std = c99". Дополнительные возможности см. В ответе Имрана.
Matt J

Да, это действительно C; это просто не валидный C89 / C90.
Кейт Томпсон

@KeithThompson: уточнил.
Blorgbeard выйдет

Вы все еще говорите, что это недействительный C, только с оговоркой. Это совершенно верно C; стандарт 1999 года заменил и заменил стандарт 1990 года, а стандарт 2011 года заменил и заменил стандарт 1999 года (хотя последний не существовал, когда вы первоначально опубликовали этот ответ).
Кейт Томпсон

@KeithThompson Ну, я думал, что говорю не об этом. Считаете ли вы, что фраза "не действует в стандарте C89 / C90" правильно?
Blorgbeard выйдет

13

@Blorgbeard :

Новые возможности C99

  • встроенные функции
  • объявление переменной больше не ограничивается областью файла или началом составного оператора
  • несколько новых типов данных, включая long long int, необязательные расширенные целочисленные типы, явный логический тип данных и сложный тип для представления комплексных чисел
  • массивы переменной длины
  • поддержка однострочных комментариев, начинающихся с //, как в BCPL или C ++
  • новые библиотечные функции, такие как snprintf
  • новые файлы заголовков, такие как stdbool.h и inttypes.h
  • типовые математические функции (tgmath.h)
  • улучшенная поддержка плавающей запятой IEEE
  • назначенные инициализаторы
  • составные литералы
  • поддержка вариативных макросов (макросов переменной арности)
  • ограничить квалификацию, чтобы разрешить более агрессивную оптимизацию кода

http://en.wikipedia.org/wiki/C99

Экскурсия по C99


6

если вы компилируете в C, измените

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

в

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

Вы также можете скомпилировать с набором переключателей C99. Поместите -std = c99 в строку компиляции:

gcc -std=c99 foo.c -o foo

ССЫЛКА : http://cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode


3

Для всех, кто пытается скомпилировать код из внешнего источника, который использует утилиту автоматической сборки, такую ​​как Make , чтобы избежать необходимости отслеживать явные вызовы компиляции gcc, вы можете установить переменную среды. Введите в командной строке или введите .bashrc (или .bash_profile на Mac):

export CFLAGS="-std=c99"

Обратите внимание, что аналогичное решение применимо, если вы столкнетесь с аналогичным сценарием с компиляцией C ++, для которой требуется C ++ 11, вы можете использовать:

export CXXFLAGS="-std=c++11"

1

У меня была такая же проблема, и она работает, вам просто нужно объявить iвне цикла:

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}

1

Джихене Стамбули ответил на вопрос ОП наиболее прямо ... Вопрос был; Почему

for(int i = low; i <= high; ++i)
{
    res = runalg(i);
    if (res > highestres)
    {
        highestres = res;
    }
}

выдать ошибку;

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

на что ответ

for(int i = low...

должно быть

int i;
for (i=low...

1

Включить режим C99 в Code :: Blocks 16.01

  • Зайдите в Настройки -> Компилятор ...
  • В разделе « Флаги компилятора» на вкладке « Параметры компилятора» установите флажок « Привести gcc в соответствие с языковым стандартом ISO 1999 г. [-std = c99] ».

0

Для Qt-creator: просто добавьте следующие строки в файл * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.