【问题标题】:compile part of code using -std=c11 flag使用 -std=c11 标志编译部分代码
【发布时间】:2018-08-14 08:46:43
【问题描述】:

是否有可能编译具有不同标志的代码的一部分 - 无需更改 makefile 中的标志?

我有一个未针对 -std=c11 设置的现有项目。现在我添加了自己的代码,编译器会告诉我类似

'for' loop initial declarations are only allowed in C99 or C11 mode

当我将标志更改为 std=c11 或 c99 时,程序的其余部分将不再编译。

C++ 中是否有类似 extern "C" {} 的东西告诉编译器将以下部分视为 std=c11?

谢谢

【问题讨论】:

  • 您是否有理由不希望 C11 中的程序的其余部分?如果您不要求代码必须在 C90 中,那么正确的解决方案是将其全部转换为 C11。不应该这么费劲。因为如果您在选择 -std=c11 时遇到编译器错误,那么这就是代码异味的强烈指标,例如意外使用非标准功能或调用定义不明确的行为。
  • 是的,这是一个巨大的项目,我没有编程......
  • 如果这是一个庞大的项目并且更改编译器选项不可行,只需按照 C90 标准编写代码即可。
  • 您应该能够使用您想要的任何编译器标志为您的文件添加特定的 make 规则。你如何做到这一点将取决于 Makefile。
  • 如果项目使用automake,见gnu.org/software/automake/manual/html_node/…

标签: c eclipse gcc


【解决方案1】:

据我所知,您无法在本地设置编译器选项。但是,您可以使用 diagnostic pragmas 在本地禁用虚假警告。

但是,最好的方法可能是将 C99/C11 代码隔离在单独的 .c 文件中,在将它们与项目的其余部分分开编译,然后再将它们链接在一起。

【讨论】:

    【解决方案2】:

    我认为没有编译指示可以在本地强制 -std=c99/-std=c11(即使您可以对其他一些选项执行等效操作,例如 -On 选项),但您几乎可以拥有即使在 C90 中也没有太多语法中断的 for-loop-local 初始化声明。只需将 for 循环括在大括号中并将声明放在那里:{ int i=0; for(;i<5;i++){ something(); } }

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多