获取C++;代码::块和VisualStudio中的编译器遵循C++;(11) 标准? < >我使用两个C++编译器/IDE。(1)代码中的G+::VisualStudio./P>中的块和(2)Visual C++

获取C++;代码::块和VisualStudio中的编译器遵循C++;(11) 标准? < >我使用两个C++编译器/IDE。(1)代码中的G+::VisualStudio./P>中的块和(2)Visual C++,c++,c++11,visual-studio-2013,codeblocks,C++,C++11,Visual Studio 2013,Codeblocks,我有一些关于如何按照我想要的方式设置编译器的问题 代码::块:我想让G++遵循标准C++。例如: int x; cin >> x; int arr[x]; ……在标准C++中不起作用。< /P> 在标准C++中,必须使用动态分配。例如,Visual C++编译器会拒绝此代码。但是,此代码可以在代码::块中工作 如何让g++拒绝此代码 P>也可以告诉G++和Visual C++ 2013遵循什么,只遵循C++ 11标准?在我看来,默认的版本仍然是C++98/03。编译器选项的标

我有一些关于如何按照我想要的方式设置编译器的问题

代码::块:我想让G++遵循标准C++。例如:

int x; 
cin >> x; 
int arr[x];

……在标准C++中不起作用。< /P> 在标准C++中,必须使用动态分配。例如,Visual C++编译器会拒绝此代码。但是,此代码可以在代码::块中工作

如何让g++拒绝此代码

<> P>也可以告诉G++和Visual C++ 2013遵循什么,只遵循C++ 11标准?在我看来,默认的版本仍然是C++98/03。

编译器选项的标准一致性。 使用您想要的g++时,至少

  • -std=c++11
    用于c++11标准
  • -pedantic
    警告使用语言扩展
  • -Wall-Wextra
    将警告级别提高到合理水平

用Visual C++,你希望,至少,

  • /nologo
    要关闭详细版本和版权信息
  • /EHsc
    打开异常支持
  • /GR
    要启用RTTI支持,请提供运行时类型信息,如
    动态\u cast
  • /W4
    将警告级别提高到合理水平

使用VisualC++,没有特殊的选项来表示C++标准版本。 如何为命令行使用预设选项。 MinGW g++通常(Nuwen发行版除外)默认生成依赖于驻留在MinGW\bin目录中的DLL的可执行文件,这意味着您通常需要在

PATH
环境变量中使用DLL

这意味着,通过批处理文件、快捷方式或命令intepreter宏添加选项不是一个好主意。而是使用选项
-dumpspecs
和重定向在该Windows命令指定的目录中创建specs文件(使用该名称):

g++ --print-search-dirs | find "install:"
阅读如何编辑该文件,然后修复它。;-)

您可能需要将
CPATH
环境变量设置为常规include目录

使用Visual C++:

  • 编译器选项可以在
    CL
    环境变量中预设
  • Include
    变量中包含路径
  • LIB
    变量中的库路径
  • 链接器选项可以在
    LINK
    变量中预设
对于链接器选项,您可能希望在生成GUI子系统可执行文件时使用
/entry:mainCRTStartup
,以支持普通标准
main
启动功能。然而,这与MFC有点冲突。我已经很多年没有做过MFC了,所以如果你想了解详细信息或解决方案,请另发一个问题,其他人可以回答

如何在每个IDE中设置选项(代码::块,Visual Studio)。 这就像阅读每个IDE的文档一样简单。;-)


请注意,选项可以全局设置,也可以按项目设置。

代码块和Visual Studio不是编译器,而是IDE。代码块将使用您告诉它的任何编译器,VisualStudio使用它自己的专有编译器。对于GCC,考虑使用<代码> -ANSI 标志。用MSVC装运的编译器称为MSC,但也可以插入其他编译器。此外,该编译器还附带了一些SDK。关于代码块,它通常与GCC一起用作编译器。因此,您的问题基本上是如何告诉每个编译器遵守某个标准,这几乎很容易通过一点研究就发现。
-pedantic
标志适用于
gcc
clang
,并告诉他们警告不标准的代码,必须有办法设置此标志。您可以使用<代码>学究错误<代码>使其成为一个错误。有趣的事实是,不再支持C++在MSVC中的特定扩展,也意味着您不能构建Win32应用程序,因为SDK标头不干净。这里有三个部分来解决这个问题,即(1)编译器使用什么选项,(2)如何为命令行使用配置或预配置这些选项,以及(3)如何在每个IDE中配置或预配置它们。
-Wall-Wextra
请<代码>-墙太可怜了。@LightnessRacesinOrbit:谢谢。但是,
-Wextra
关于未初始化的警告通常在没有
-O
的情况下工作吗?我不想说任何我不知道的话。我记得以前它需要
-O
。对不起,我不知道你指的是什么。我看了()。它说,
-Wextra
启用了
-Wuninitialized
。一些/许多年前,人们必须指定至少一些优化,以便使用分析工具,而不是使其能够在一般情况下警告未初始化变量的使用,尽管它可以在特殊情况下这样做。我只是想知道你是否知道现在情况如何?因为如果我用
-Wextra
修改答案,如果它实际上也需要
-O
,那么应该提到这一点,否则就不会。我从来没有听说过,也从来没有测试过,也从来没有遇到过问题。文档说明,
-wm可能未初始化
仅在存在优化的情况下才有可能<代码>-Wuninitialized仅适用于数据流分析未忽略的变量。不管怎样,我看不出这与在你的答案中包含
-Wextra
有什么关系。