这些 G++ 标志的 Visual Studio 等效项?

Posted

技术标签:

【中文标题】这些 G++ 标志的 Visual Studio 等效项?【英文标题】:Visual Studio equivalent for these G++ flags? 【发布时间】:2016-02-14 22:39:06 【问题描述】:

我正在编译一个使用 CMake 的项目,它假定编译器是 G++,但我实际上使用的是 Visual Studio 2013。在CMakeLists.txt 文件中,我遇到了这一行

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11 -Wall -Wextra -pedantic")

我想我应该用类似的东西替换

if(MSVC)
    set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS ????")   # what goes here??
else()
    set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11 -Wall -Wextra -pedantic")
endif()

我对 Visual Studio 的世界还很陌生,所以虽然我知道 G++ 标志的含义,但我不知道它们的 Visual Studio 等价物。我认为:

-std=c++11 告诉 G++ 使用 C++ 2011,我认为这是 Visual Studio 2013 中的默认设置,所以我认为我不需要为此设置标志。 -Wall 好像大概对应/W4,而-Wextra 大概对应/Wall?但是在 VS 上,/Wall 包含 /W4,所以 /Wall 本身就足够了吗? -pedantic 检查是否严格符合 C++ 标准。不知道 VS 等价物可能是什么。

任何人都可以确认要使用的正确标志是 Visual Studio 吗?

【问题讨论】:

不幸的是,MSVC 似乎缺乏对系统包含路径的理解,因此启用/Wall 通常会在您的构建输出中包含数百个警告标准库/实现标头,因此我通常使用/W4 来保留理智:) 【参考方案1】:

我使用的是 Visual Studio 2015,但我预计这些标志不会有任何重大差异:

C++11 是标准的,但您应该检查Support for C++11/14/17-page 以确保并可能升级到 VS2015-compiler。 Visual Studio 有一个“警告级别”,您可以在其中选择 /W0-/W4 和 /Wall。因此,使用 Visual Studio 本身,您不能同时指定 /W4 和 /Wall,这使我得出结论 /Wall 就足够了。 我能找到的最接近“迂腐”的东西是我会将其翻译(抱歉,这里是德语 VS)为“停用语言扩展”,并且是选项 /Za

【讨论】:

请注意,STL 建议不要使用 /Za here: /Za is C1XX’s option to enable extra conformance, but it also enables extra compiler bugs in rarely-used codepaths, so we discourage its use. @melak47 关于/Za 的良好警告。就我而言,它最终破坏了 Windows SDK 标头,所以对我来说绝对不行。

以上是关于这些 G++ 标志的 Visual Studio 等效项?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 Professional 中的 /analyze 标志

面向 XP 的 Visual Studio 2013 的 Visual C++ 编译器标志

Visual Studio 2019 LLVM clang 标志

Visual Studio代码java调试无法正常工作

Visual Studio 编译器标志 /arch 和性能

Visual Studio C++ 编译器标志:-Zm200 是啥?