我最近-pedantic
在 gcc 上启用了选项,现在我有大约两三页“ISO C90 禁止混合声明和代码”警告。
我对这个项目的目标是能够将它部署在任何带有 ac 编译器的主流系统上,所以我意识到假设 C99 将在所有地方都得到支持是不明智的,但我是否值得花时间来解决这些警告?
是否还有不支持混合声明和代码的 c 编译器的系统?
我最近-pedantic
在 gcc 上启用了选项,现在我有大约两三页“ISO C90 禁止混合声明和代码”警告。
我对这个项目的目标是能够将它部署在任何带有 ac 编译器的主流系统上,所以我意识到假设 C99 将在所有地方都得到支持是不明智的,但我是否值得花时间来解决这些警告?
是否还有不支持混合声明和代码的 c 编译器的系统?
那么,您是否打算用 C89/90 或 C99 编写代码?
由于这是您似乎关心的唯一警告,显然您的代码实际上是用 C89/90 编写的。如果确实如此,并且您打算坚持使用 C89/90,那么我将坚持严格的 C89/90 并将所有声明移至块的开头。
另一方面,如果您愿意并计划切换到 C99,那么“错位”声明不再是问题。然后你主要关心的是平台/编译器支持。MS Visual Studio C 编译器是 C89/90 编译器。这是一个问题吗?(考虑到 GCC 在 Windows 平台上可用)。
如果您想-pedantic
了解 C99 标准,请添加选项-std=c99
。
就我个人而言,我喜欢较旧的未混合样式,因为它可以更轻松地直观地审核函数正在使用的内存类型,并在返回之前确定可能需要 free() 的内容。
Visual Studio C 编译器不允许混合声明和代码。微软可能永远不会向 Visual Studio 添加完整的 C99 支持;C 在 Windows 世界中还不够重要。
我不确定我会改变它。
但是,如果您确实决定要这样做,那很容易(所以也许您应该这样做);只需在开始代码块后立即进行所有声明。如果您绝对必须稍后定义它们,请使用另一个嵌套代码块。
IIRC,Visual C++ 不允许在 C 模式下混合声明和代码。
总的来说,Visual C++ 在 C99 支持方面一直落后。然而,这种情况最近可能有所改善,无论如何都可以在 C++ 模式下编译您的代码。
我会消除该特定警告,因为混合代码和声明不是广泛支持的功能。
实际上,我正在编写的库也有同样的问题。我正在使用可变参数宏,但似乎更受支持。
为了确保我的库可以被其他人真正使用,我将使用尽可能多的编译器对其进行测试。我已经用 Visual C++ Express 和 Pelles C 完成了它,我将尝试其他一些(至少 OpenWatcom、Mars C 和 lcc-Win32)。
不幸的是,SourceForge 不再像几年前那样提供编译器农场,而且我无法在商业 Unix 编译器上对其进行测试。