我的代码库主要是 C 和一点 C++,主要是用 gcc 构建的,但偶尔需要用 MSVC 构建。微软的 C 编译器仍然与 C89 差不多,只是有一些小的扩展,而且它仍然不支持混合代码和变量定义à la C++/C99。所以我需要找到一种方法来防止开发人员在使用 gcc 时编写乱序代码/变量定义,否则构建随后会与 MSVC 中断。如果我使用gcc -std=c89
,那么一切都会中断,因为不允许使用 C++ 样式的注释(可能还有其他问题,但我没有进一步研究这个问题)。如果我使用gcc -std=gnu89
那么乱序代码/变量定义是允许的,所以这对我也没有帮助。有任何想法吗 ?我想我只需要类似的东西gcc -std=c99 -fno-inline-variable-definitions
,如果存在这样的选项。
3 回答
如gcc 警告信息页面所述,您正在使用-Wall
-Wextra
-Wstrict-prototypes
-Wold-style-definition
-Wmissing-prototypes
-Wmissing-declarations
and选项。请注意,这些可能会因系统头文件中的问题而引起很多噪音,并且它们只是警告,因此您必须制定一个热衷于零警告构建的策略。-Wdeclaration-after-statement
我不相信有办法做你想做的事。MSVC 支持的 C 方言比 C99 更接近 C89(例如,它也不支持指定的初始值设定项);你真的想要更类似于 C89-with-C++-comments-and-inline-keyword 的东西。
问题在于C++ 注释会影响有效 C89 代码的正确性。例如,这一行的含义发生了很大的变化:
int a = 10//* foo */2;
我想说您最好的选择是在您的 C 源文件中强制执行 C89,包括 C89 样式的注释。 inline
不过可能没问题:您可以__inline
在 gcc 上定义它。
使代码无法编译的不是 Win32,而是编译器。您可以在 Win32 上使用 GCC并获得更好的跨平台兼容性。
另一种可能性是为您的 Win32 构建使用 C++ 编译;GCC 编译已经确定它是有效的 C,并且 C++ 编译通常也会使其更强大的 C。
[编辑] 另一种解决方案是使用持续集成服务器,例如CruiseControl,这样每当 GCC 平台编码人员签入代码时,CI 服务器可以签出并使用 VC++ 构建它(甚至应用第三方静态分析工具)并在错误时将结果通过电子邮件发送给签入错误代码的用户。这个解决方案对于原始问题可能是重量级的,但除此之外还可能产生许多其他好处。