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

12
假设我正在处理一个庞大的代码库,并启用了警告w44101。这意味着如果我进入我的项目并右键单击属性-> C / C ++->命令行,/w44101将显示在附加选项部分。
我想通过更改配置而不是源代码来禁用此警告。我尝试进入属性-> C / C ++->所有选项->禁用特定警告,并输入4101,这实际上会在属性-> C / C ++->命令行中产生/wd"4101"。但是,当我编译我的项目时,它仍然会抛出4101警告。为什么/wd"4101"/w44101彼此不能相互取消?
我使用Windows 10和Visual Studio 2015。正确的禁用此警告的方法是什么?如果提出的解决方案可以通过CMake中的某种类型的函数调用,则最好不要修改.sln文件。
编辑:我正在处理的此代码库具有默认严格的编译标志。它使用/W4/WX进行编译。还有其他级别4的附加警告,例如/w44101/w44062/w44191等。

查看详细的构建日志。在编译命令中,这两个选项中哪一个是最后一个?如果父级将其放在命令行部分,则您可能希望将其放在命令行部分,而不是“禁用特定警告”部分。 - n. m.
@n.m. 你说得对...如果我手动将“wd4101”移动到“w44101”之后的附加选项,它实际上可以编译。现在,我只需要找出如何在CMake中做到这一点。如果您知道,请毫不犹豫地写一个答案,我会接受它。 - user3667089
修复你的4101与44101不一致之处。如果你无法修复你的问题,那么我们不想浪费时间帮助你,因为你证明了你不听取我们的评论。 - Phil1970
2
@Phil1970,你自己有没有试过?如果你输入的是/w4101而不是/w44101,它甚至都不能编译。第一个数字4表示它是来自警告级别4。 - user3667089
我不知道 /w4 是用于警告级别的。事实上,我总是使用 Visual Studio 的默认设置,如果代码中仍然存在一些警告,我会直接在文件中使用 pragma。因此,显然,/wd4101/w44101 不会相互取消,因为最后一个取决于错误级别,这是你在问题中没有提供的信息。因此,如果您以3级或更低级别编译,则永远不会看到两个选项的警告。 - Phil1970
“/w14101”会是“/wd4101”的相反,只要你至少在警告级别1下编译。从文档中看,似乎不可能始终在级别0下启用警告。根据我所做的所有测试与文档中的解释一致。我所能想到的唯一原因是在项目级别禁用了警告(并且没有其他冲突的选项),才会收到该警告,除此之外,这个问题中并没有足够的信息来理解您的问题。 - Phil1970
2个回答

14

在您的问题中,您启用了警告44101(如果我没记错,这个警告不存在?),但禁用了警告4101:这是一个打字错误吗?

编辑:

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


无论如何,如果您的项目是由CMake生成的,可以使用add_compile_options来添加编译当前目录中源文件的选项。这可用于在“全局作用域”下以警告级别4启用警告4101

add_compile_options(/w44101)
你可以使用 target_compile_definitions 来针对每个目标禁用它:
add_library(foo ...)
target_compile_definitions(foo PUBLIC /wd4101)

编辑:

根据你的评论,在该代码库的头部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是关于未使用变量的警告,这很容易修复 ;)

(参见相关问题“如何最佳地消除未使用变量的警告?”



4101被用作示例,因为它很容易复制。在repo的头部CMakeList中有set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /w44101"),而在我的项目CMakeList中,我尝试做set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4101")但是它没有起作用。我用你的add_compile_optionstarget_compile_definitions互换了它们,但仍然会抛出警告。在你那边可以吗? - user3667089
我尝试了 list(REMOVE_ITEM CMAKE_CXX_FLAGS /w44101) 但是它仍然对我抛出了警告。在你那边可以用吗? - user3667089
受到你的方法启发,我实际上找到了一个可行的解决方案。string(REGEX REPLACE "/w44101" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")。请编辑你的答案并加入这个内容,我会接受它! - user3667089
1
@user3667089 我编辑了我的回答。如果我错了,请纠正我,但是您在匹配字符串中没有使用任何正则表达式,因此您可以只使用string(REPLACE "/w44101" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - rocambille
非常糟糕的答案。它又长又错误。 - Jimmy Chen
显示剩余2条评论

4
我在谷歌上搜索了“cmake禁用visual studio警告”,然后就来到这里了。虽然这不完全是原帖所问的问题,但如果这是首位结果... 在CMake 3.21.3版本中,add_compile_options (/wd <warningNumber>) 对我没起作用。实际上,add_compile_options甚至在Notepad++中都没有语法高亮显示。相反,我找到了一个来自2008年的网页。它建议使用 add_definitions,而这对我有效。
...
if(WIN32)
  add_definitions("/wd4251")
endif(WIN32)

我通常不建议忽略警告,但在这种情况下,我正在使用几个第三方和供应商的DLL进行构建,据我所知,警告4251并不一定表示有问题。它只是在说:“你调用的所有这些函数都需要具有DLL界面(我已经知道了),因此请确保你正确地操作。” 这个警告会刷屏输出,使得很难发现其他更重要的警告,所以我决定将其禁用。


add_compile_definitions() 应该可以正常工作。 - Mohammad Kanan
为了针对每个目标禁用特定的警告,将target_compile_options(${PROJECT_NAME} PRIVATE /wd4369)翻译成中文。 - KulaGGin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接