Как исправить ошибку GCC «начальное объявление цикла for, используемое вне режима C99»?
Вопрос
Я пытаюсь решить задача 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 с плавающей запятой
- назначенные инициализаторы
- составные литералы
- поддержка вариативных макросов (макросов переменной арности)
- ограничить квалификацию, чтобы обеспечить более агрессивную оптимизацию кода
если вы скомпилируете на 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...