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

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

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

        }

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

Чтобы перейти в режим C99 в CodeBlocks, выполните следующие шаги:

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

@Blorgbeard:

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

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

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

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

Ответ 7

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

export CFLAGS="-std=c99"

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

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

Ответ 8

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

int i;

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

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

}

Ответ 9

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...

Ответ 10

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

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

Ответ 11

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99

Ответ 12

Просто скомпилируйте в режиме С++. Вам не нужно использовать классы для использования С++. Я в основном использую С++ как "лучше C":)

Я почти никогда не использую классы и никогда не использую метод override.