我在一个代码库上工作,这个代码库主要是带有一点点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
这样的东西。
答案 0 :(得分:13)
您正在使用-Wall
-Wextra
-Wstrict-prototypes
-Wold-style-definition
-Wmissing-prototypes
-Wmissing-declarations
和-Wdeclaration-after-statement
选项,如上所述gcc warnings info page。请注意,这些可能会导致系统头文件中的问题产生大量噪音,并且它们只是警告,所以您必须制定一个热衷于实现零警告构建的策略。
答案 1 :(得分:3)
我不相信有办法做你想做的事。 MSVC支持的C语言比C99更接近C89(例如,它也不支持指定的初始化器);你真的想要更类似于C89-with-C ++ - comments-and-inline-keyword。
的问题是C ++注释会影响有效C89代码的正确性。例如,这条线的含义发生了很大变化:
int a = 10//* foo */2;
我想说你最好的办法就是在你的C源文件中强制执行C89,包括C89风格的注释。 inline
可能没问题:您可以在gcc上将其定义为__inline
。
答案 2 :(得分:1)
不是Win32使代码无法编译,而是编译器。您可以使用GCC on Win32并获得更好的跨平台兼容性。
另一种可能性是为您的Win32构建使用C ++编译; GCC编译已经确定它是有效的C,而C ++编译通常也会使它更强C。
[编辑] 另一种解决方案是使用连续集成服务器,例如CruiseControl,以便每当GCC平台编码签入代码时,CI服务器都可以检出并使用VC ++构建它(甚至应用第三方静态分析工具)并在出错时通过电子邮件将结果发送给签入错误代码的用户。对于原始问题,这种解决方案可能是重量级的,但除此之外还可能产生许多其他好处。