如何在gcc中强制执行C89样式的变量声明?

时间:2010-06-23 07:45:47

标签: c visual-c++ gcc c99 c89

我在一个代码库上工作,这个代码库主要是带有一点点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 个答案:

答案 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 ++构建它(甚至应用第三方静态分析工具)并在出错时通过电子邮件将结果发送给签入错误代码的用户。对于原始问题,这种解决方案可能是重量级的,但除此之外还可能产生许多其他好处。