代码之家  ›  专栏  ›  技术社区  ›  Paul R

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

  •  11
  • Paul R  · 技术社区  · 15 年前

    我在一个代码基础上工作,主要是C,有一点C++,大部分是用GCC构建的,但偶尔需要用MSVC来构建。微软的C编译器仍然是相当多的带有一些小扩展的C89,它仍然不支持混合代码和变量定义。 阿拉 C++/C99。因此,我需要找到一种方法来防止开发人员在使用GCC时编写无序的代码/变量定义,否则构建随后会中断MSVC。如果我使用 gcc -std=c89 然后一切都会中断,因为不允许使用C++风格的评论(可能还有其他问题,但我没有进一步研究)。如果我使用 gcc -std=gnu89 然后,允许使用无序的代码/变量定义,因此这对我也没有帮助。有什么想法吗?我想我只需要 gcc -std=c99 -fno-inline-variable-definitions 如果存在这样的选择。

    3 回复  |  直到 15 年前
        1
  •  13
  •   Donal Fellows    15 年前

    你在追求 -Wall -Wextra -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wdeclaration-after-statement 选项,如 gcc warnings info page . 请注意,这些可能会导致系统头文件中的问题产生大量噪声,它们只是警告,因此您必须有一个非常希望生成零警告的策略。

        2
  •  3
  •   caf    15 年前

    我不相信有什么方法可以做到你想要的。MSVC支持的C语言比C99更接近C89(例如,它也不支持指定的初始值设定项);您真的需要类似于C89-with-C++-comments和inline关键字的语言。

    问题在于 那个 是C++注释会影响有效的C89代码的正确性。例如,此行的含义会发生重大变化:

    int a = 10//* foo */2;
    

    我想说,您最好的办法是在C源文件中强制使用C89,包括C89样式的注释。 inline 不过,可能还可以:您可以将其定义为 __inline 关于海湾合作委员会。

        3
  •  1
  •   Clifford    15 年前

    使代码不可编译的不是win32,而是编译器。你可以使用 GCC on Win32 并获得更大的跨平台兼容性。

    另一种可能性是为您的Win32构建使用C++编译;GCC编译将已经确定它是有效的C,并且C++编译通常会使C更强大。

    [编辑] 另一种解决方案是使用连续集成服务器,例如 CruiseControl 配置为当GCC平台编码人员签入代码时,CI服务器可以使用VC++签出并构建代码(甚至应用第三方静态分析工具),错误时将结果通过电子邮件发送给签入错误代码的用户。这个解决方案对于最初的问题可能很重要,但可能会产生许多其他的好处。