是否可以仅为源文件的一部分强制执行C或C ++语言标准?我想确保我的源文件符合C90,但它取决于一些需要C99的头文件。这些头文件的合规性对我来说并不重要(我暂时可以使用C99进行编译),但我想尽量减少将代码移植到更具限制性的平台所需的工作量。
简而言之,我希望将语言标准应用于整个文件,但包含的标题除外。鉴于标头包含在C和C ++中是如何工作的,我认为一般的问题是将语言标准应用于给定源文件的任意部分。
我正在与GCC合作,但我也很好奇其他编译器(msvc,clang)是否可以这样做。
答案 0 :(得分:3)
没有。您不能将文件(编译单元)构建为部分语言标准,而另一部分则是另一种语言标准。
所做的是将文件拆分为两个文件,并使用不同的语言标准对它们进行编译(只需确保它仍然定义为以后链接两个目标文件)。
更好的解决方案是确保所有代码符合新旧语言标准,然后使用它。
答案 1 :(得分:3)
如果您想要确保您的代码与C90兼容,同时仍然依赖于使用C99的标头,则可以启用GCC警告标记-Wc90-c99-compat
。这允许您使用C99功能,但只要您使用C90中没有的功能,就会发出警告。为避免在头文件中生成这些警告(可能是正确的),请在包含文件后使用编译指示启用警告。
这基本上可以达到你想要的效果。警告仅针对您指定的代码发出。
#include "myheader.h"
#pragma GCC diagnostic warning "-Wc90-c99-compat"
void func(void) { ... }
更严格的版本是使用:
#pragma GCC diagnostic error "-Wc90-c99-compat"
据我所知,Clang大部分兼容,但MSVC并不真正支持C99,所以你自己就是这样。