Як виправити помилку GCC "для початкового декларування циклу, що використовується поза режимом C99"?


116

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

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

        }

На жаль, я отримую цю помилку, коли намагаюся компілювати з GCC:

3np1.c: 15: error: 'for', початкове декларування циклу, що використовується поза режимом C99

Я не знаю, що таке режим C99. Будь-які ідеї?

Відповіді:


148

Я б спробував оголосити 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 читайте тут .


то чому б ви не використовували цикл while замість цього?
Ерік Ш

3
@ErikW ваше питання дуже поганий
користувач25

118

Існує перемикач компілятора, який включає режим C99 , який, крім іншого, дозволяє оголошувати змінну всередині циклу for. Щоб увімкнути його, використовуйте перемикач компілятора-std=c99

Або як говорить @OysterD, оголосити змінну поза циклом.


7
насправді -std = gnu99, ймовірно, є більш бажаним, оскільки таким чином ви все одно отримуєте розширення gcc (gcc за замовчуванням на -std = gnu89, однак це зміниться на gnu99 в якийсь момент у наступних кількох версіях)
Spudd86

3
@ Spudd86: Чи потрібно ввімкнути розширення gcc, залежить від того, що ви робите. Вимкнення їх корисно, якщо ваша мета - написати код, переносний для компіляторів, крім gcc.
Кіт Томпсон

21

Щоб перейти в режим C99 у CodeBlocks , виконайте наступні кроки:

Клацніть Параметри проекту / побудови , потім на вкладці Налаштування компілятора виберіть підвідділ Інші параметри та розмістіть -std=c99у текстовій області та натисніть кнопку ОК .

Це ввімкне режим C99 для вашого компілятора.

Я сподіваюся, що це комусь допоможе!


Це допомогло в кодових блоках 16.1 за іншими параметрами компілятора ! Хоча я використовував, -std=gnu99як зображено в деяких відповідях вище!
Анкур Шах

Але це допомогло тимчасово! Я маю це робити кожен раз, коли складаю код! ... :(
Анкур Шах

Ні, у вас немає! Це потрібно зробити для кожного нового проекту лише один раз.
akelec

14

Я теж отримав цю помилку.

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

не відповідає стандарту C89 / C90. Як говорить OysterD, вам потрібно зробити:

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

Ваш оригінальний код дозволений у C99 та пізніших стандартах мови C.


3
Для gcc, киньте його "-std = c99". Для додаткових функцій див. Відповідь Імрана.
Метт J

Так, це дійсно C; це просто не дійсно C89 / C90.
Кіт Томпсон

@KeithThompson: уточнено.
Blorgbeard вийшов

Ви все ще говорите, що це неправда C, лише з кваліфікацією. Він цілком дійсний С; стандарт 1999 р. замінив і замінив стандарт 1990 р., а стандарт 2011 р. замінив і замінив стандарт 1999 р. (хоча останнього не існувало, коли ви спочатку опублікували цю відповідь).
Кіт Томпсон

@KeithThompson Ну, це не те, що я думав, що говорю. Чи вважаєте ви, що "неправильно в стандарті C89 / C90" правильно?
Blorgbeard вийшов

13

@Blorgbeard :

Нові функції в C99

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

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


3

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

export CFLAGS="-std=c99"

Зауважте, що подібне рішення застосовується, якщо ви зіткнулися з подібним сценарієм зі компіляцією C ++, яка вимагає C ++ 11, ви можете використовувати:

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

1

У мене була така ж проблема, і вона працює, ви просто повинні оголосити iзовнішню петлю:

int i;

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

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

}

1

Jihene Stambouli відповів на питання ОП найбільш безпосередньо ... Питання було; чому

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

Увімкніть режим C99 у коді :: Блоки 16.01

  • Перейдіть у Налаштування -> Компілятор ...
  • У розділі " Прапорці компілятора" на вкладці " Налаштування компілятора" встановіть прапорець " Чи слід gcc дотримуватися мовного стандарту ISO C 1999 [-std = c99] "

0

Для Qt-творця: просто додайте наступні рядки до файлу * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.