如何在Code::Blocks中使用C11标准

4
就像标题所说,我需要让code::blocks支持C11,但我不知道该怎么做。
我进入了设置 => 编译器设置 => 其他选项,并添加了-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,64位,GCC-5.2):
./install/gcc-5.2.0/bin/gcc5.2 program.c -o program

看起来运行良好。

我的问题是,如何让code::blocksc11一起工作?


由于GCC 5.x版本默认使用-std=gnu11运行,Code::Blocks必须执行某些操作(例如传递 -ansi-std=gnu90)来使编译器以不同的方式工作。调查所有发送到编译器的选项。找到一种方法让Code::Blocks 显示编译时使用的确切命令。然后解决问题。(我没有使用过Code::Blocks,所以我无法提供更多帮助,假设这有任何帮助)。 - Jonathan Leffler
@JonathanLeffler 这是我使用的选项 =>> -Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -std=gnu11 -O0 -g -ansi pkg-config --cflags gtk+-3.0 - Michi
-ansi 是罪魁祸首;它相当于 -std=c90 或者 -std=gnu90 — 它明确地撤销了 -std=c11-std=gnu11。另外,你可以在注释的代码块中使用两个反引号开头和结尾以及一个在中间来嵌入反引号:-Wall … `pkg-config --cflags gtk+-3.0` — 就像这样。 - Jonathan Leffler
@JonathanLeffler 谢谢,你说得对,-ansi 就是问题所在。我原本以为我也需要这个选项,但其实不用。 - Michi
8个回答

5

由于GCC 5.x版本默认使用-std=gnu11,因此Code::Blocks必须对编译器进行一些操作(例如传递-ansi-std=gnu90),以使其发生变化。

调查所有发送到编译器的选项。找到一种方法让Code::Blocks显示编译时使用的确切命令。然后找出如何解决它。

Options that are used are:

-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


我不知道,希望其他标志都没问题。 - Michi
是的,尽管-O0不是我通常使用的选项。我经常使用-O3 -g。我会添加一些:-Wmissing-prototypes -Wold-style-definition,有时还会添加其他选项。一旦你失去了-ansi,你所拥有的就是可行的,但可能有点次优(因为-O0意味着最小化优化)。 - Jonathan Leffler
我使用-O0的主要原因是因为这个 =>> 请看这里 - Michi
@Lundin:也许默认安装无法正常工作。OP表明他已经在GCC 5.2和4.9之间切换,因此他擅长配置它。答案中的关键点是-ansi标志类似于-std=c90,不应该使用(或在-std=gnu11之后不使用)。 - Jonathan Leffler
@JonathanLeffler 很抱歉回复晚了。您是对的。我目前正在运行4个不同的编译器版本(GCC),我可以随时在代码块中切换。我无法确认Lundin所说的,因为我已经有超过10年没有使用Windows了。但在Linux上是可以的。 - Michi
显示剩余2条评论

3

我只是一个学习者(初学者-非常新),但我希望这可能会有所帮助(尽管该线程已经过时)。

(图像中可见的代码示例12.2-来自Stephen Prata C Primer Plus的forc99.c)

我创建了新标志

设置 ->编译器 ->(在常规下)右键单击常规 ->新标志 ->输入图像详细信息 ->确定 然后选中刚刚创建的新标志的框(对我有用)

【如果您查看图像,就会发现有一个选项为-std = c99(位于我创建的选项上方),您可以使用该选项来支持c99。】

(顺便说一句,code :: blocks 16.01 mingw 32bit的gcc版本,我使用此版本为4.9.2)


3
假设您使用的是 Windows 版的 Codeblocks 13.12,它附带了一个较旧版本的 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 中添加上述路径:设置 -> 编译器 -> 工具链可执行文件选项卡 -> 编译器安装目录。点击“自动检测”按钮。
  • 在同一选项卡中,检查 C 编译器是否为 x86_64-w64-mingw32-gcc.exe(因为现在您可能在计算机上安装了多个 GCC 版本),并且 make 程序是否为 mingw32-make.exe
  • 在编译器设置选项卡中,右击编译器标志列表,并选择“新标志”。对于“名称”,键入 C11,对于编译器标志,键入-std=c11。单击确定并勾选刚刚创建的新选项。
  • 还要确保符合 C11 规范,勾选“将错误视为 ISO C 所需的警告”(-pedantic-errors)选项。勾选“启用所有常见编译器警告”(-Wall)选项。

谢谢你的回答,对于那些使用微软(Windows)产品的人来说是很好的,但我自从2004年就成为了Linux用户。我在我的问题中已经解释了我使用的是ubuntu 15.04, 64BIT, gcc-5.2。无论如何,对你的回答点赞。 - Michi
@Michi 在Codeblocks中配置不同编译器并设置其按照C11进行编译的方法在Ubuntu中应该是相同的。可能更容易,因为您不必经历Mingw安装的麻烦。无论如何,您似乎以错误的方式添加了编译器选项,本答案解释了您应该如何设置Codeblocks以便进行C11编译。 - Lundin
这些编译器选项 -Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -Wmissing-prototypes -Wold-style-definition -std=c11 -O0 -g 是我的编译器选项,但我曾经使用过 -ansi 并不知道它与 -std=c11 冲突。 - Michi

1

前往设置->编译器->编译器标志->常规->选中旁边的复选框"让g++遵循c++11 ISO标准" 完成!!!


0

我在我的CodeBlock项目中也遇到了同样的问题。我使用的是CodeBlock版本:17.12。

我通过以下步骤解决了这个问题:

  1. 进入设置 -> 编译器选项卡。
  2. 打开“全局编译器设置”窗口。
  3. 检查所选编译器:“GNU GCC编译器”
  4. 选择“编译器标志”选项卡。
  5. 选择以下复选框:
    • 让g++遵循C++11 ISO C++语言标准
    • 让gcc遵循2011年ISO C语言标准
  6. 保存设置。
  7. 现在我能够编译C++11代码了。

希望这对你们也有用。


0

进入设置 -> 编译器设置

确保左侧选项卡中选择了全局编译器设置。

enter image description here

在右侧选项卡上,点击编译器设置选项卡。在常规下,勾选“让gcc遵循1999年ISO C语言标准[-std=c99]”旁边的框。

enter image description here


-2
原因是你在 for 循环中声明了 i。 尝试像下面这样分开声明:
#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;
        }

它会起作用的。编码愉快:)


我给你点赞是因为今天我犯了和你一样的错误,只看代码而没有读整个问题。请再次阅读问题并做出好的回答。 :) - Michi
代码没有问题,问题是关于C11的。你知道C11甚至C99是什么吗?这并没有回答问题,甚至与问题无关。 - Lundin

-3

进入“设置” -> “编译器”,然后查看选项跟随“c++11 ISO inc编译器”设置选项卡。

enter image description here


OP 询问 C11 版本。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接