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

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

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

        }

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

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

Я не знаю, что такое режим C99. Есть идеи?

24.08.2008 06:30:09
11 ОТВЕТОВ
РЕШЕНИЕ

Я бы попробовал объявить 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;
}

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

147
8.11.2017 07:20:39
тогда почему бы вам не использовать цикл while?
Erik W 15.01.2015 18:26:35
@ErikW ваш вопрос очень плохой
user25 20.05.2018 21:37:08

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

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

116
15.11.2013 09:39:45
на самом деле -std = gnu99, вероятно, более желателен, так как таким образом вы все еще получаете расширения gcc (по умолчанию gcc -std = gnu89, однако в некоторых следующих версиях это изменится на gnu99)
Spudd86 17.06.2010 13:46:37
@ Spudd86: хотите ли вы включить расширения gcc, зависит от того, что вы делаете. Их отключение полезно, если ваша цель - написать код, переносимый на другие компиляторы, кроме gcc.
Keith Thompson 12.09.2013 23:40:53

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

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

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

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

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

14
13.09.2013 01:25:37
Для gcc, бросьте это "-std = c99". Для дополнительных функций, см. Ответ Имрана.
Matt J 29.01.2009 01:19:01
Да, это действительно C; это просто не действует C89 / C90.
Keith Thompson 12.09.2013 23:41:35
@KeithThompson: уточнено.
Blorgbeard is out 13.09.2013 00:10:42
Вы все еще говорите, что это не действительный C, только с квалификацией. Это совершенно верно C; стандарт 1999 года заменил и заменил стандарт 1990 года, а стандарт 2011 года заменил и заменил стандарт 1999 года (хотя последний не существовал, когда вы первоначально опубликовали этот ответ).
Keith Thompson 13.09.2013 00:20:08
@KeithThompson Ну, это не то, что я думал, что говорил. Считаете ли вы, что «недопустимо в стандарте C89 / C90» правильно?
Blorgbeard is out 13.09.2013 00:33:23

@Blorgbeard :

Новые функции в C99

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

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

Тур C99

13
23.05.2017 12:34:18

если вы компилируете в 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

REF: http://cplusplus.syntaxerrors.info/index.php?title= 'for'_loop_initial_declaration_used_outside_C99_mode

6
8.04.2013 05:25:12

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
0
29.05.2013 14:27:19

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

int i;

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

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

}
1
12.09.2013 23:32:33

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

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

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

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

21
2.04.2017 12:17:30
Это помогло в кодовых блоках 16.1 под опциями Other Compiler ! Хотя я использовал, -std=gnu99как показано в некоторых ответах выше!
Ankur Shah 10.04.2016 18:20:22
Но это помогло временно! Я должен делать это каждый раз, когда я компилирую код! ... :(
Ankur Shah 10.04.2016 20:50:57
Нет, у вас нет! Это должно быть сделано для каждого нового проекта только один раз.
akelec 11.04.2016 06:57:17

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

export CFLAGS="-std=c99"

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

export CXXFLAGS="-std=c++11"
2
27.06.2018 15:37:50

Jihene Stambouli ответил на вопрос OP самым прямым образом ... Вопрос был; Почему

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
7.10.2018 06:51:25

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

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