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

StackOverflow https://stackoverflow.com/questions/24881

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

        }

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

@Блоргберд:

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

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

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

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

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

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

int i;

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

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

}

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

export CFLAGS="-std=c99"

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

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

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99

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

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...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top