【问题标题】:How to use C11 standard in Code::Blocks如何在 Code::Blocks 中使用 C11 标准
【发布时间】:2015-12-08 18:27:56
【问题描述】:

正如标题所说,我需要让code::blocksC11 一起工作,但我不知道该怎么做。

我去了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::blocksc11 一起工作?

【问题讨论】:

  • 由于 GCC 5.x 版本默认使用-std=gnu11 运行,Code::Blocks 必须做一些事情(例如将-ansi-std=gnu90)传递给编译器以使其工作不同。调查发送给编译器的所有选项。找到一种方法让 Code::Blocks 向您显示它在编译时使用的确切咒语。然后想办法解决。 (我没有使用过 Code::Blocks,所以我没有比这更有帮助的了——假设这有任何帮助。)
  • @JonathanLeffler 这是使用的选项 =>> -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。 (而且,仅供参考,您可以在注释的代码块中嵌入反引号,方法是使用两个开始和结束以及一个在中间:-Wall … `pkg-config --cflags gtk+-3.0` — 就像那样。
  • @JonathanLeffler 谢谢你,没错,-ansi 是问题所在。我虽然我也需要那个选项,我的意思是-ansi

标签: c codeblocks c11 gcc5.2


【解决方案1】:

由于 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

【讨论】:

  • 不知道,希望其他的Flags没问题。
  • 是的,虽然-O0 不是我通常使用的。我经常使用-O3 -g。我添加了一些:-Wmissing-prototypes -Wold-style-definition,有时还会添加其他一些。一旦你失去了-ansi,你所得到的虽然可能有点次优(因为-O0 意味着最小优化)。
  • 我使用-O0的主要原因是因为这个=>> Please take a look
  • 嗯……很有趣。使用-O0 编译,这样即使您的程序如此简单以至于 GCC 可以优化您的内存泄漏,它们仍然会被发现,因为它们没有被优化掉。如果内存没有泄漏是因为编译器发现它不需要分配内存,那么它仍然是泄漏吗? (当没有人听到时,一棵树倒在森林里会发出声音吗?)有趣的是优化器是多么复杂。我不确定是否会因此而经常使用-O0。感谢您的外部参考。
  • 我认为这不适用于默认安装的 Codeblocks,因为它使用的是旧版本的 GCC。半年前我安装了 Codeblocks,然后我不得不手动告诉它使用不同的 GCC。由于这是针对 Windows 的,我不得不指出 MinGW 64 的安装。
【解决方案2】:

假设适用于 Windows 的 Codeblocks 13.12,它带有不支持 C11 的旧版 GCC (4.7.1)。

  • 手动下载最新版本的 Mingw 64 编译器(我不认为 Mingw32 被维护为包含 C11 的 GCC 版本)。
  • 安装它。它最终会出现在一些不起眼的文件夹中,例如 C:\Program Files\mingw-w64\x86_64-4.9.1-win32-seh-rt_v3-rev1\mingw64
  • 在Codeblocks,Settings -> Compiler -> Toolchain executables tab -> Compiler的安装目录中添加上述路径。点击“自动检测”按钮。
  • 在同一选项卡中,检查 C 编译器是否为 x86_64-w64-mingw32-gcc.exe(因为您现在可能在您的计算机上安装了多个 GCC)以及 make 程序是否为 mingw32-make.exe
  • 在选项卡编译器设置中,右键单击编译器标志列表并选择“新建标志”。对于 C11 中的“名称”类型,对于编译器标志,请输入 -std=c11。单击确定并检查您刚刚创建的新 C11 选项。
  • 此外,为了确保符合 C11,请选中“将错误视为 ISO C 要求的警告...”选项 (-pedantic-errors)。选中“启用所有常见的编译器警告”选项 (-Wall)。

【讨论】:

  • 感谢您的回答,这对使用 Microsoft(Windows)产品的人来说会很好,但我自 2004 年以来就是 Linux 用户。我确实在我的问题中解释了我使用 @ 987654325@。任何方式 +1 为您的答案。
  • @Michi 配置代码块以选择不同的编译器并将其设置为根据 C11 编译的方式在 Ubuntu 中应该是相同的。可能要容易得多,因为您不必经历 Mingw 安装大惊小怪。无论如何,你似乎以错误的方式添加编译器选项,这个答案解释了你应该如何设置 Codeblocks 为 C11 编译。
  • 这个-Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -Wmissing-prototypes -Wold-style-definition -std=c11 -O0 -g 是我的编译器选项,但我使用过-ansi 并且不知道与-std=c11 有冲突。
【解决方案3】:

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

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

我创建了新标志

Settings -> Compiler -> (under general)右键General -> New Flag -> Enter details from image -> Ok 之后,选中刚刚创建的新标志的复选框。 (为我工作)

[如果您在图片中查看 -std=c99 选项(就在我创建的那个上方),您可以使用该选项来支持 c99。]

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

【讨论】:

    【解决方案4】:

    转到设置->编译器->编译器标志->常规->勾选“让g++遵循c++11 ISO”旁边的框 完成!!!

    【讨论】:

      【解决方案5】:

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

      我通过以下步骤修复:

      1. 转到设置 -> 编译器选项卡。
      2. “全局编译器设置:”pop is openend。
      3. 检查选定的编译器:“GNU GCC 编译器”
      4. 选择“编译器标志”选项卡。
      5. 选中以下复选框:
        • 让 g++ 遵循 C++11 ISO C++ 语言标准
        • 让 gcc 遵循 2011 ISO C 语言标准
      6. 保存设置。
      7. 现在我可以编译 C++11 代码了。

      希望它也适用于你们。

      【讨论】:

        【解决方案6】:

        转到设置 -> 编译器设置

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

        在右侧选项卡上,单击编译器设置选项卡。一般来说,勾选“让 gcc 遵循 1999 ISO C 语言标准 [-std=c99]

        【讨论】:

          【解决方案7】:

          原因是因为你在 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;
                  }
          

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

          【讨论】:

          • 我为你投票,因为今天我犯了和你一样的错误,看代码而不阅读整个问题。请再次阅读问题并对此做出很好的回答。 :)
          • 代码没有问题,问题是关于C11的。你甚至知道C11,甚至C99是什么吗?这没有回答问题 - 它甚至与问题无关。
          【解决方案8】:

          转到“设置”->“编译器”,然后查看“c++11 ISO inc 编译器”设置选项卡后面的选项。

          【讨论】:

          • OP 要求 C11
          猜你喜欢
          • 2015-04-18
          • 1970-01-01
          • 2012-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-27
          • 1970-01-01
          相关资源
          最近更新 更多