Как использовать стандарт C11 в Code :: Blocks

Как сказано в заголовке, мне нужно заставить code::blocks работать с C11, и я не могу понять, как это сделать.

Я перешел к settings => compiler settings => Other options, добавил -std=c11 и попробовал также с -std=gnu11, оба не работают.

Я скомпилировал gcc-5.2, а затем изменил компилятор по умолчанию (gcc-4.9), но результата все равно не было.


Когда я пытаюсь скомпилировать следующую программу:

#include<stdio.h>

int main(void){
    int arr[] = {0,1,2,3,4};

    for(int i=0;i<5;i++){
        printf("%d ",arr[i]);
    }

    return 0;
}

Получаю следующее:

|6|error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode|

Но если я сделаю это в терминале (ubuntu 15.04, 64BIT, gcc-5.2):

./install/gcc-5.2.0/bin/gcc5.2 program.c -o program

Вроде нормально работает.

У меня вопрос, как заставить code::blocks работать с c11?


person Michi    schedule 08.12.2015    source источник
comment
Поскольку версии GCC 5.x по умолчанию работают с -std=gnu11, Code :: Blocks должен что-то делать (например, передавать -ansi или -std=gnu90) компилятору, чтобы заставить его работать по-другому. Изучите все параметры, отправленные компилятору. Найдите способ, чтобы Code :: Blocks показывал вам точное заклинание, которое он использует при компиляции. Тогда подумайте, как это исправить. (Я не использовал Code :: Blocks, поэтому не могу быть более полезным, чем это - при условии, что это вообще поможет.)   -  person Jonathan Leffler    schedule 08.12.2015
comment
@JonathanLeffler Это параметры, которые используются = ›› -Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -std=gnu11 -O0 -g -ansi pkg-config --cflags gtk+-3.0   -  person Michi    schedule 08.12.2015
comment
-ansi наносит ущерб; он эквивалентен -std=c90 или, возможно, -std=gnu90 - он явно отменяет -std=c11 или -std=gnu11. (И, к вашему сведению, вы можете вставлять обратные кавычки в блок кода комментария, используя два в начале и в конце и один посередине: -Wall … `pkg-config --cflags gtk+-3.0` - вот так.   -  person Jonathan Leffler    schedule 08.12.2015
comment
@JonathanLeffler Спасибо, верно, -ansi была проблема. Я думал, что мне тоже нужна эта опция, я имею в виду -ansi   -  person Michi    schedule 08.12.2015


Ответы (8)


Поскольку версии GCC 5.x по умолчанию работают с -std=gnu11, Code :: Blocks должен что-то делать (например, передавать -ansi или -std=gnu90) компилятору, чтобы он работал по-другому.

Изучите все параметры, отправленные компилятору. Найдите способ, чтобы Code :: Blocks показывал вам точное заклинание, которое он использует при компиляции. Затем подумайте, как это исправить.

Используются следующие параметры:

-Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -std=gnu11 \
-O0 -g -ansi `pkg-config --cflags gtk+-3.0`

-ansi наносит ущерб; он эквивалентен -std=c90 или, возможно, -std=gnu90 - он явно отменяет -std=c11 или -std=gnu11.

person Jonathan Leffler    schedule 08.12.2015
comment
Я не знал, надеюсь, другие флаги в порядке. - person Michi; 08.12.2015
comment
Да, хотя -O0 я бы обычно не использовал. Я обычно использую -O3 -g. Я добавляю одни: -Wmissing-prototypes -Wold-style-definition, а иногда и другие. Как только вы потеряете -ansi, то, что у вас есть, будет работать, хотя, возможно, немного неоптимально (потому что -O0 означает минимальную оптимизацию). - person Jonathan Leffler; 08.12.2015
comment
Основная причина, по которой я использую -O0, заключается в следующем = ›› Пожалуйста, посмотрите - person Michi; 08.12.2015
comment
Хм… интересно. Скомпилируйте с -O0, так что даже если ваша программа настолько проста, что GCC может оптимизировать ваши утечки памяти, они все равно будут обнаружены, потому что они не оптимизированы. Если утечка памяти не происходит из-за того, что компилятор обнаруживает, что ей не нужно выделять память, это все еще утечка? (И издает ли падающее в лесу дерево, когда его никто не слышит?) Интересно, насколько сложен оптимизатор. Я не уверен, что буду использовать -O0 очень часто только из-за этого. Спасибо за x-ref. - person Jonathan Leffler; 08.12.2015
comment
Я не думаю, что это сработает с установкой кодовых блоков по умолчанию, потому что он использует более старую версию GCC. Я установил Codeblocks полгода назад, а затем мне пришлось вручную указать ему использовать другой GCC. Поскольку это было для Windows, мне пришлось указать на установку MinGW 64. - person Lundin; 11.12.2015
comment
@Lundin: Возможно, это не сработает при установке по умолчанию. OP указал, что он переключился между GCC 5.2 и 4.9, поэтому он умеет его настраивать. Ключевым моментом в ответе является то, что флаг -ansi похож на -std=c90 и не должен использоваться (или не использоваться после -std=gnu11). - person Jonathan Leffler; 11.12.2015
comment
@JonathanLeffler Извините за поздний ответ. Ты прав. В настоящее время я использую 4 разные версии компилятора (GCC), и я могу переключить их в code :: block в любое время. Я не могу подтвердить то, что сказал Лундин, потому что я использовал Windows более 10 лет назад. В Linux вы можете. - person Michi; 23.07.2016

Предполагая, что Codeblocks 13.12 для Windows, он поставляется с более старой версией GCC (4.7.1), которая не поддерживает C11.

  • Загрузите вручную последнюю версию компилятора Mingw 64 (я не думаю, что Mingw32 поддерживает версии C11 для GCC).
  • Установите его. Он окажется в какой-то непонятной папке вроде C:\Program Files\mingw-w64\x86_64-4.9.1-win32-seh-rt_v3-rev1\mingw64.
  • Добавьте указанный выше путь в Codeblocks, Настройки -> Компилятор -> вкладка Исполняемые файлы Toolchain -> Каталог установки компилятора. Нажмите кнопку «Автоопределение».
  • На той же вкладке убедитесь, что компилятор C - x86_64-w64-mingw32-gcc.exe (поскольку теперь у вас может быть несколько установок GCC на вашем компьютере), а программа make - mingw32-make.exe.
  • На вкладке «Настройки компилятора» щелкните правой кнопкой мыши список флагов компилятора и выберите «Новый флаг». Для "name" введите C11, для флагов компилятора введите -std=c11. Нажмите ОК и отметьте только что созданную новую опцию C11.
  • Также, чтобы гарантировать соответствие C11, отметьте опцию «обрабатывать ошибки как предупреждения, требуемые ISO C ...» (-pedantic-errors). Установите флажок «Включить все общие предупреждения компилятора» (-Wall).
person Lundin    schedule 11.12.2015
comment
Спасибо за ответ, это будет хорошо для тех, кто работает с продуктами Microsoft (windows), но я использую Linux с 2004 года. В своем вопросе я объяснил, что использую ubuntu 15.04, 64BIT, gcc-5.2. В любом случае +1 за ваш ответ. - person Michi; 11.12.2015
comment
@Michi Однако способ настройки кодовых блоков для выбора другого компилятора и установки его для компиляции в соответствии с C11 должен быть таким же в Ubuntu. Вероятно, намного проще, так как вам не нужно мучиться с установкой Mingw. В любом случае, похоже, вы неправильно добавляете параметры компилятора, этот ответ объясняет, как вы должны установить кодовые блоки для компиляции для C11. - person Lundin; 11.12.2015
comment
Это -Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -Wmissing-prototypes -Wold-style-definition -std=c11 -O0 -g мои параметры компилятора, но я использовал -ansi и не знал, что это конфликтует с -std=c11. - person Michi; 11.12.2015

Я просто ученик (новичок - очень новичок), но я надеюсь, что это может помочь (хотя тема старая).

(на изображении виден код, пример 12.2 - forc99.c от Stephen Prata C Primer Plus)

code_blocks_16.01

Я создал новый флаг

Настройки -> Компилятор -> (под общими) Щелкните правой кнопкой мыши на Общие -> Новый флаг -> Введите данные с изображения -> Хорошо. После этого установите флажок только что созданного нового флага. (работал у меня)

[Если вы посмотрите на изображение, там есть опция -std = c99 (чуть выше созданной мной), вы можете использовать эту опцию для поддержки c99.]

(Кстати, версия gcc для code :: blocks 16.01 mingw 32bit, я использую это, это 4.9.2)

person 1565986223    schedule 15.12.2016

Перейдите в Настройки-> компилятор-> Флаги компилятора-> Общие-> поставьте галочку напротив «Сделать g ++ следовать ISO c ++ 11» ВЫПОЛНЕНО !!!

person Jyoti Yadav    schedule 27.09.2017

Я также столкнулся с той же проблемой в моем проекте CodeBlock. Я использую версию CodeBlock Version: 17.12.

Я исправил следующие шаги:

  1. Перейдите в Настройки -> Вкладка Коппилятор.
  2. "Глобальные настройки компилятора:" открыта.
  3. Отметьте выбранный компилятор: "Компилятор GNU GCC"
  4. Выберите вкладку «Флаг компилятора».
  5. Select following check boxes:
    • Have g++ follow the C++11 ISO C++ language standard
    • Следуйте ли gcc языковому стандарту ISO C 2011 г.
  6. Сохраните настройки.
  7. Теперь я могу выполнять код Complie C ++ 11.

Надеюсь, это сработает и для вас, ребята.

person Chandan kumar    schedule 20.01.2019

Зайдите в Настройки -> Настройки компилятора.

Убедитесь, что на левой вкладке выбраны глобальные настройки компилятора.

введите здесь описание изображения

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

введите здесь описание изображения

person chandraprakash-dev    schedule 27.02.2019

Причина в том, что вы объявляете i в цикле for. Попробуйте разделить его, как показано ниже:

#include<stdio.h>

    int main(void)

        {
            int arr[] = {0,1,2,3,4};
            int i;
            for(i=0;i<5;i++){
                printf("%d ",arr[i]);
            }

            return 0;
        }

Это будет работать. Удачного кодирования :)

person Ayesha Gupta    schedule 11.08.2016
comment
Я поддержал вас, потому что сегодня я совершил ту же ошибку, что и вы сейчас, просмотрев Код, не прочитав весь Вопрос. Пожалуйста, прочтите вопрос еще раз и дайте на него хороший ответ. :) - person Michi; 11.08.2016
comment
С кодом все в порядке, вопрос про С11. Вы хоть знаете, что такое C11 или даже C99? Это не отвечает на вопрос - это даже не связано с вопросом. - person Lundin; 12.08.2016

перейдите к «настройке» -> «компилятор», затем посмотрите параметр, следующий за вкладкой настройки «c ++ 11 ISO inc compiler».

введите описание изображения здесь

person Ravi Guru    schedule 25.11.2016
comment
OP просил C11 - person Antti Haapala; 06.11.2017