【问题标题】:MinGW Compiler for Windows, using GCC, C99 vs GNU99用于 Windows 的 MinGW 编译器,使用 GCC、C99 与 GNU99
【发布时间】:2013-07-28 16:36:23
【问题描述】:

我正在使用适用于 Windows 的 MinGW 编译器。我正在用 C 语言编写一些程序。我读到的大部分文章似乎都已经过时了……上次我读到的 C99 在 GCC 中是不完整的,这仍然是真的吗?我真正的问题是设置 C99 和 GNU99 之间的跨平台兼容性......我是否应该避免使用 GNU99 设置及其扩展并坚持使用 C99?我是这个 MinGW 编译器集的新手,因为我一直使用 Visual Studio 并决定尝试一些新的东西......现在我正在使用这些设置进行编译......

-march=native -O3 -std=gnu99

我应该输入任何推荐的编译器命令来制作 C 程序以及使用此编译器制作 C++ 程序吗?

我想制作一个与 Windows、Mac 和 Linux 兼容的简单程序,但首先是 Windows。

【问题讨论】:

  • 所以你在问题的结尾加入了 C++,但在大多数情况下,你似乎主要关注 C 和 C99。您是否打算以 C++11 为目标?

标签: c++ c compiler-construction mingw c99


【解决方案1】:

关于 C,Visual Studio until recently 不支持 C99 at all

关于gcc,您可以找到详细的detailed writeup 支持的标准以及所涉及的角落和缝隙。他们也有一个很好的list of extensions 他们支持。您需要小心gcc 和扩展,因为仅指定要使用的标准不足以在使用扩展时生成警告或错误。例如,您可能会惊讶于使用:

gcc -std=c90 -W -Wall

允许您在没有警告的情况下使用variable length arrays。为了生成警告,您需要添加-pedantic

gcc -std=c90 -W -Wall -pedantic

然后这会产生一个类似这样的警告:

warning: ISO C90 forbids variable length array ‘array’ [-Wvla]

【讨论】:

    【解决方案2】:

    如果你想要使用“任何”编译器编译的东西,你应该避免使用gnu99 设置,并使用c89c99c11- 对于C++ 使用c++03c++11 (或c++0x 取决于它是哪个特定版本的编译器)。你做这些事情的时间越晚,你就越局限于“新版本的编译器”。

    gnu99 表示带有“GNU 扩展”的 C99,这意味着使用此设置编译的代码可能无法在其他编译器上编译。

    你当然也应该申请-Wall,我也喜欢-Wextra -Werror-Wall 表示启用(几乎)所有警告,-Wextra 表示启用除-Wall 之外的额外警告,-Werror 表示您必须在收到任何代码之前修复任何警告(“将警告视为错误” )。

    【讨论】:

    • 感谢您的提示!在我的 C 和 C++ 编译器设置的末尾添加了 -Wall -Wextra -Werror。还决定使用 c11 和 c++11,因为它们是官方/最新的,而且我还是喜欢多线程。
    • 请注意gcc 将允许您在没有警告的情况下使用某些扩展名,除非您指定-pedanticVLA 是第一个想到的示例。
    • @ShafikYaghmour C11 不会允许 VLA,因为它现在是可选的吗?
    • @CodeCamper 例如,如果您指定-std=c90,它根本不会警告您,这可能会让许多人感到惊讶,尽管他们的文档确实涵盖了这一点。
    【解决方案3】:

    gcc 已支持大部分 C99 功能,详情请参阅Status of C99 features in GCC

    一些 GNU 扩展使用起来很方便。是否在 C99 和 GNU99 之间进行选择取决于您是否要使用其他编译器。但是如果你考虑的是 Visual Studio,它不支持 C99,所以如果你以后要回到 Visual Studio,还是选择 C89。

    【讨论】:

    • 老实说,我想离开 Visual Studio,因为我的目标不是专门为 Windows 制作程序。我的主要目标是最简单的跨系统兼容性。如果我可以使用适用于 Windows、Mac 和 Linux 的开源/免费解决方案编译 C99,那么这对我来说很重要。感谢您让我知道 VS 仅支持 C89 我不知道。也许他们会在 2019 年更新到 1999 年?
    • @CodeCamper 个人认为Visual Studio 2019年也不会支持C99。另一方面,gcc现在已经支持部分C11了。
    • 我确保将编译器设置更改为 C11 和 C++11,因为未来只会变得更具未来感。
    • @YuHao c99 在 Visual Studio 中的支持已由 Microsoft blogs.msdn.com/b/vcblog/archive/2013/06/28/… 宣布
    • @ouah:一直有一些支持 C99,例如//cmets。但仍然没有完全合规的计划。
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2021-12-21
    • 2021-11-15
    • 2010-11-17
    相关资源
    最近更新 更多