C++ MinGW编译器Windows版,使用GCC、C99与GNU99

C++ MinGW编译器Windows版,使用GCC、C99与GNU99,c++,c,compiler-construction,mingw,c99,C++,C,Compiler Construction,Mingw,C99,我正在使用Windows的MinGW编译器。我正在用C语言制作一些程序。我读到的关于这个的大部分文章似乎都过时了。。。我上次读到的C99在GCC中是不完整的,这仍然是真的吗?我真正的问题是设置C99和GNU99之间的跨平台兼容性。。。我应该避免使用GNU99设置及其扩展,而只使用C99吗?我是这个MinGW编译器集的新手,因为我一直使用visualstudio,并决定尝试一些新的东西。。。现在我正在使用这些设置进行编译 -march=native -O3 -std=gnu99 我想制作一个与

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

-march=native -O3 -std=gnu99
<是否有任何推荐的编译器命令,用于编写C程序,也可以用这个编译器制作C++程序?< /P>
我想制作一个与Windows、Mac和Linux兼容的简单程序,但首先是大多数Windows。

gcc支持C99的大部分功能,有关详细信息,请参阅


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

如果您想要使用“任意”编译器编译的内容,则应避免使用
gnu99
设置,并使用
C89
,<代码> C99 < /> >或<代码> C11< /代码>,对于C++使用<代码> C++ 03 或<代码> C++ 11 (或<代码> C++ 0x<代码> >取决于编译器的特定版本)。这些事情做得越晚,就越局限于“新版本的编译器”

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


你肯定也应该使用
-Wall
,我也喜欢
-Wextra-Werror
-Wall
表示启用(几乎)所有警告,
-Wextra
表示启用超出
-Wall
中警告之外的额外警告,
-Werror
表示在获得任何代码之前必须修复任何警告(“将警告视为错误”)

对于C,
visualstudio
不支持

关于
gcc
,您可以找到他们支持的标准以及涉及的细节。他们也有一个他们支持的很好的团队。您需要稍微小心使用
gcc
和扩展,因为仅指定要使用的标准不足以在使用扩展时生成警告或错误。例如,您可能会惊讶于使用:

gcc -std=c90 -W -Wall
允许您在没有警告的情况下使用。要生成警告,您需要添加
-pedantic

gcc -std=c90 -W -Wall -pedantic
然后这将生成类似于以下内容的警告:

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

老实说,我想离开VisualStudio,因为我的目标不是专门为Windows制作程序。我的主要目标是尽可能实现最简单的跨系统兼容性。如果我能用Windows、Mac和Linux的开源/免费解决方案编译C99,那么这对我来说就是最重要的。谢谢你让我知道VS只支持C89,我不知道。也许2019年它们会更新到1999年?@codecamp个人认为,即使在2019年,VisualStudio也不会支持C99。另一方面,gcc现在已经支持C11的一部分。我确保将我的编译器设置更改为C11和C++11,因为未来只会变得更具未来感。@微软@ouah宣布在Visual Studio中对YuHao c99的支持:总是有一些对c99的支持,例如
/
注释。但是仍然没有完全合规的计划。谢谢你的提示!添加了Walth-WOTH-WError,用于C和C++的编译器设置结束。还决定使用c11和c++11,因为它们是官方/最新版本,而且我还是喜欢多线程。请注意,
gcc
将允许您在没有警告的情况下使用某些扩展,除非您指定
-pedantic
VLA
是第一个想到的例子。@ShafikYaghmour不会允许VLA,因为它现在是可选的?@CodeCamper例如,如果您指定
-std=c90
它将根本不会警告您,这可能会让许多人感到惊讶,虽然他们的文档确实覆盖了这个,所以你在C++的结尾加上了C++,但在大多数情况下,你似乎特别关注C和C99。您是否计划以C++11为目标?