我正在使用适用于Windows的MinGW编译器。我在C中制作了一些程序。我读到的大部分文章似乎都已经过时了......最后我读到C99在GCC中是不完整的,这仍然是真的吗?我真正的问题是设置C99和GNU99之间的跨平台兼容性...我应该避免使用GNU99设置和它的扩展,只是坚持使用C99?我是这个MinGW编译器集的新手,因为我一直使用Visual Studio并决定尝试新的东西......现在我正在使用这些设置进行编译......
-march=native -O3 -std=gnu99
我是否应该为制作C程序以及使用此编译器制作C ++程序而输入任何推荐的编译器命令?
我想制作一个与Windows,Mac和Mac兼容的简单程序。 Linux,但首先是大多数Windows。
答案 0 :(得分:3)
如果你想要用“任何”编译器编译的东西,你应该避免gnu99
设置,并使用c89
,c99
或c11
- 和C ++使用c++03
或c++11
(或c++0x
,具体取决于编译器的特定版本)。你继续这些事情,你越是限制“新版本的编译器”。
gnu99
表示带有“GNU扩展”的C99,这意味着使用此设置编译的代码可能无法在其他编译器上编译。
您当然也应该使用-Wall
,我也希望-Wextra -Werror
。 -Wall
表示启用(几乎)所有警告,-Wextra
表示启用-Wall
之外的额外警告,而-Werror
表示您必须在获得任何警告之前修复任何警告代码(“将警告视为错误”)。
答案 1 :(得分:1)
gcc支持大多数C99功能,有关详细信息,请参阅Status of C99 features in GCC。
一些GNU扩展很方便使用。是否在C99和GNU99之间进行选择取决于您是否要使用其他编译器。但是如果您正在考虑使用Visual Studio,它不支持C99,那么如果您稍后再回到Visual Studio,那么坚持使用C89就是您的选择。
答案 2 :(得分: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]