如何在 Visual Studio 中禁用从父级继承的特定警告?

How to disable specific warning inherited from parent in Visual Studio?

假设我正在处理默认启用警告 w44101 的大型代码库。这意味着如果我进入我的项目并右键单击属性 -> C/C++ -> 命令行 -> /w44101 显示在附加选项部分。

我希望能够通过更改配置而不是源代码来禁用此警告。我尝试进入属性 -> C/C++ -> 所有选项 -> 禁用特定警告并输入 4101,这实际上会在属性 -> [=32= 中产生一个 /wd"4101" ]++ -> 命令行。但是,当我编译我的项目时,它仍然会抛出 4101 警告。为什么 /wd"4101"/w44101 不相互抵消?

我在 Windows 10 和 Visual Studio 2015。禁用此警告的正确方法是什么?如果建议的解决方案可以在 CMake 中使用某种类型的函数调用,那将是更可取的,因为此代码库的 .sln 文件是由 CMake 生成的。

编辑:我正在处理的这个代码库默认设置了严格的编译标志。它是用 /W4/WX 编译的。还有额外的 4 级警告,举几个例子,/w44101/w44062/w44191

在你的问题中,你正在启用警告 44101(如果我是对的,它不存在?),但禁用警告 4101:这是一个错字吗?

编辑:

您在问题的评论中回答了这个问题。读取 MSDN documentation/wlnnnn 选项允许将 l 的警告级别设置为 nnnn 指定的警告编号。因此 /w44101 在级别 4 启用警告编号 4101


无论如何,如果你的项目是用CMake生成的,add_compile_options可以用来增加当前目录源文件编译的选项。这可用于在警告级别 4 的 "global scope" 处启用警告 4101

add_compile_options(/w44101)

然后您可以使用 target_compile_definitions 按目标禁用它:

add_library(foo ...)
target_compile_definitions(foo PUBLIC /wd4101)

编辑:

根据您的评论,在回购协议的 head CMake 文件中有:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /w44101")

并且在您的项目 CMake 文件中您尝试执行以下操作:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4101")

您应该做的是从 CMAKE_CXX_FLAGS 中删除 /w44101。您可以使用 string(REPLACE ...)/w44101 替换为空字符串来实现此目的:

string(REPLACE "/w44101" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

显然,最好的解决方案是修复生成警告的代码。 4101 是关于未使用的变量,这很容易修复 ;)

(参见相关问题 "How do I best silence a warning about unused variables?"

我在谷歌上搜索了“cmake disable visual studio warning”,这让我来到了这里。这不完全是 OP 要问的问题,但如果这是最热门的...

add_compile_options(/wd<warningNumber>) 对我不起作用(CMake 版本 3.21.3)。事实上,add_compile_options 在 notepad++ 中甚至不是 syntax-highlighted。相反,我从 2008 年开始一直找到 this page。它建议改用 add_definitions,这对我有用:

...
if(WIN32)
  add_definitions("/wd4251")
endif(WIN32)

我通常不提倡忽略警告,但在这种特殊情况下,我针对几个第 3 方和供应商 DLL 进行构建,据我所知,警告 4251 不一定表示一个问题。它只是在说,“你调用的所有这些函数都需要有一个 DLL-interface(我已经知道了),所以确保你做的是正确的”。这个警告淹没了输出,很难发现其他更重要的警告,所以我决定禁用它。