Как исправить ошибку "GCC для первоначального объявления цикла, используемого вне режима C99"? - PullRequest
113 голосов
/ 24 августа 2008

Я пытаюсь решить проблему 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. Есть идеи?

Ответы [ 10 ]

142 голосов
/ 24 августа 2008

Я бы попытался объявить 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 здесь .

113 голосов
/ 24 августа 2008

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

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

20 голосов
/ 01 декабря 2014

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

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

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

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

14 голосов
/ 24 августа 2008

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

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

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

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

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

13 голосов
/ 25 августа 2008

@ Blorgbeard

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

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

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

Тур C99

5 голосов
/ 08 апреля 2013

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

1 голос
/ 27 июня 2018

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

export CFLAGS="-std=c99"

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

export CXXFLAGS="-std=c++11"
1 голос
/ 13 сентября 2013

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

int i;

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

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

}
0 голосов
/ 07 октября 2018

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...
0 голосов
/ 29 мая 2013

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...