Windows下的MinGW编译器,使用GCC,C99与GNU99的区别。

3

我正在使用Windows下的MinGW编译器,制作一些C程序。我阅读的大部分文章似乎都已过时...最后我读到的是GCC中的C99不完整,这仍然正确吗?我的真正问题是在设置C99和GNU99之间的跨平台兼容性...我应该避免使用GNU99设置及其扩展,只使用C99吗?作为一个新手,我对MinGW编译器集不熟悉,因为我一直在使用Visual Studio并决定尝试一些新东西...现在我正在使用这些设置编译...

-march=native -O3 -std=gnu99

是否有建议的编译器命令可以用来制作C程序和C++程序?

我想制作一个简单的程序,它能在Windows、Mac和Linux上运行,但首先是在Windows上。


所以你在问题的末尾加上了C++,但大部分情况下似乎你主要关心的是C和特别是C99。你是否计划针对C++11进行开发? - Shafik Yaghmour
3个回答

3
如果你想要编译器“通用”支持,你应该避免使用“gnu99”设置,并使用“c89”,“c99”或“c11”-对于C ++使用“c++03”或“c++11”(或根据特定版本的编译器选择“c++0x”)。你越往后走,就越限制于“新版本的编译器”。
“gnu99”表示带有“GNU扩展”的C99,这意味着使用此设置编译的代码可能无法在其他编译器上编译。
你还应该应用“-Wall”,我喜欢使用“-Wextra -Werror”。 “-Wall”表示启用(几乎)所有警告,“-Wextra”表示在“-Wall”中之外启用额外的警告,“-Werror”表示你必须在获得任何代码之前修复任何警告(“将警告视为错误”)。

感谢这些技巧!我在我的C和C++编译器设置的末尾添加了-Wall -Wextra -Werror。同时,我决定使用c11和c++11,因为它们是官方/最新的版本,而且我喜欢多线程。 - CodeCamper
1
请注意,gcc允许您在不指定-pedantic的情况下使用某些扩展,其中变长数组(VLA)是我想到的第一个例子。 - Shafik Yaghmour
@ShafikYaghmour C11是否允许VLA,因为现在它是可选的? - CodeCamper
例如,如果您指定了“-std=c90”,它将不会发出任何警告,这可能会令许多人感到惊讶,尽管他们的文档已经涵盖了这一点。 - Shafik Yaghmour

1

关于C语言,Visual Studio直到最近完全不支持C99

关于gcc,你可以找到一份详细的写作指南,了解他们支持哪个标准以及其中的注意事项。他们还有一个很好的扩展列表。你需要小心gcc和扩展,因为仅指定要使用的标准并不足以在使用扩展时生成警告或错误。例如,您可能会惊讶地发现使用以下代码:

gcc -std=c90 -W -Wall

允许您使用可变长度数组而不会出现警告。如果要生成警告,需要添加-pedantic

gcc -std=c90 -W -Wall -pedantic

然后这将生成类似于此的警告:

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

1

大多数C99特性已被gcc支持,详情请参见GCC中C99特性的状态

一些GNU扩展很方便使用。选择C99还是GNU99取决于您是否要使用其他编译器。但是,如果您考虑使用Visual Studio,则不支持C99,因此如果以后要返回Visual Studio,则坚持使用C89是更好的选择。


1
说实话,我想离开Visual Studio,因为我的目标不是专门为Windows编写程序。我的主要目标是尽可能简单地实现跨系统兼容性。如果我可以使用开源/免费的解决方案在Windows、Mac和Linux上编译C99,那就足够了。谢谢你告诉我VS只支持C89,我不知道这一点。也许他们会在2019年更新到1999年的标准? - CodeCamper
我确保将编译器设置为 C11 和 C++11,因为未来只会变得更加先进。 - CodeCamper
微软宣布在Visual Studio中支持c99,详情请见http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking-changes-in-vs-2013.aspx。@YuHao - ouah
@ouah 我想他们自1999年以来已经有足够的时间了。 - CodeCamper
1
@ouah:对于C99一直存在着某些支持,例如//注释。但是还没有完全遵循的计划。 - MSalters
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接