【问题标题】:"Mixed declaration and code" warning, is it worth addressing?“混合声明和代码”警告,值得解决吗?
【发布时间】:2009-12-29 17:42:21
【问题描述】:

我最近在 gcc 上启用了-pedantic 选项,现在我收到了大约两三页“ISO C90 禁止混合声明和代码”警告。

我对这个项目的目标是能够将它部署在任何带有 c 编译器的主流系统上,所以我意识到假设 C99 将在所有地方都得到支持是不明智的,但是是否值得我花时间解决这些警告?

是否还有不支持混合声明和代码的 c 编译器的系统?

【问题讨论】:

  • -pedantic 提出警告,嗯,很迂腐。我会说这些警告实际上是在浪费时间。

标签: c compiler-warnings


【解决方案1】:

那么,您是否打算用 C89/90 或 C99 编写代码?

由于这是您似乎关心的唯一警告,显然您的代码实际上是用 C89/90 编写的。如果确实如此,并且您打算坚持使用 C89/90,那么我将坚持严格的 C89/90 并将所有声明移至块的开头。

另一方面,如果您愿意并计划改用 C99,那么“错位”声明不再是问题。然后你主要关心的是平台/编译器支持。 MS Visual Studio C 编译器是 C89/90 编译器。这是一个问题吗? (考虑到 GCC 在 Windows 平台上可用)。

【讨论】:

  • 我的目标不是遵循任何特定的标准,我只是想确信我的代码可以在任何主流 c 编译器上编译
  • 在这种情况下,答案是:不,它不会在任何主流 C 编译器上编译。 MS VIsual Studio 编译器遵循 C89/90,不会编译此类代码。
【解决方案2】:

如果您想成为 -pedantic 了解 C99 标准,请添加选项 -std=c99

我个人喜欢较旧的未混合样式,因为它可以更轻松地直观地审核函数正在使用的内存类型,并在返回之前决定可能需要 free() 的内容。

【讨论】:

    【解决方案3】:

    Visual Studio C 编译器不允许混合声明和代码。微软可能永远不会向 Visual Studio 添加完整的 C99 支持; C 在 Windows 世界中还不够重要。

    【讨论】:

      【解决方案4】:

      我不确定我会改变它。

      但是,如果您确实决定要这样做,那很容易(所以也许您应该这样做);只需在开始代码块后立即进行所有声明。如果您以后绝对必须定义它们,请使用另一个嵌套代码块。

      【讨论】:

        【解决方案5】:

        IIRC,Visual C++ 不允许在 C 模式下混合声明和代码。

        Visual C++ 在 C99 支持方面普遍落后。不过,这种情况最近可能有所改善,无论如何都可以在 C++ 模式下编译您的代码。

        【讨论】:

          【解决方案6】:

          我会消除该特定警告,因为混合代码和声明不是广泛支持的功能。

          实际上,我正在编写的库也有同样的问题。我正在使用可变参数宏,但似乎更受支持。

          为确保我的库真正可供其他人使用,我将使用尽可能多的编译器对其进行测试。我已经用 Visual C++ Express 和 Pelles C 完成了它,我会尝试其他一些(至少是 OpenWatcom、Mars C 和 lcc-Win32)。

          不幸的是,SourceForge 不再像几年前那样提供编译器农场,我无法在商业 Unix 编译器上对其进行测试。

          【讨论】:

            猜你喜欢
            • 2011-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多