如何在 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(我已经知道了),所以确保你做的是正确的”。这个警告淹没了输出,很难发现其他更重要的警告,所以我决定禁用它。
假设我正在处理默认启用警告 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(我已经知道了),所以确保你做的是正确的”。这个警告淹没了输出,很难发现其他更重要的警告,所以我决定禁用它。