C++ 禁用单一警告错误
有没有办法在VisualStudio中仅禁用cpp文件中的一条警告行C++ 禁用单一警告错误,c++,visual-c++,warnings,pragma,C++,Visual C++,Warnings,Pragma,有没有办法在VisualStudio中仅禁用cpp文件中的一条警告行 例如,如果我捕获到一个异常而不处理它,我会得到错误4101(未引用的局部变量)。有没有一种方法可以在函数中忽略这一点,而在编译单元中报告它?目前,我将#pragma warning(disable:4101)放在文件的顶部,但这显然会关闭整个单元。而不是放在文件(甚至头文件)的顶部,只需用#pragma warning(push),#pragma warning(disable)包装有问题的代码即可和匹配的#pragma警告(
例如,如果我捕获到一个异常而不处理它,我会得到错误4101(未引用的局部变量)。有没有一种方法可以在函数中忽略这一点,而在编译单元中报告它?目前,我将
#pragma warning(disable:4101)
放在文件的顶部,但这显然会关闭整个单元。而不是放在文件(甚至头文件)的顶部,只需用#pragma warning(push)
,#pragma warning(disable)包装有问题的代码即可
和匹配的#pragma警告(pop)
,如图所示
尽管还有一些其他选项,包括#praga warning(one)
使用#pragma warning(push)
,然后#pragma warning(disable)
,然后放入代码,然后使用#pragma warning(pop)
,如下所述:
#pragma
push/pop通常是此类问题的解决方案,但在这种情况下,为什么不删除未引用的变量呢
try
{
// ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
// ...
}
如果要禁用
未引用的局部变量
请写入某些标头
template<class T>
void ignore (const T & ) {}
还可以使用
WinNT.H
中定义的UNREFERENCED\u参数。定义只是:
#define UNREFERENCED_PARAMETER(P) (P)
然后像这样使用它:
void OnMessage(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
}
为什么要使用它,您可能会认为您可以省略变量名本身。实际上,在某些情况下(不同的项目配置、调试/发布版本),可能会使用该变量。在另一个配置中,该变量未使用(因此出现警告)
一些静态代码分析可能仍然会对此无意义的语句发出警告(wParam;
)。在这种情况下,您可以使用DBG\u UNREFERENCED\u参数
,它与调试版本中的UNREFERENCED\u参数
相同,并且在发布版本中使用P=P
#define DBG_UNREFERENCED_PARAMETER(P) (P) = (P)
在某些情况下,您必须有一个命名参数,但不能直接使用它。
例如,我在VS2010上遇到它,当“e”仅在decltype
语句中使用时,编译器会抱怨,但您必须拥有命名变量e
以上所有非
#pragma建议都归结为只添加一条语句:
bool f(int e)
{
// code not using e
return true;
e; // use without doing anything
}
如果只想在一行代码中抑制警告,可以使用
抑制
:
对于单行代码,其工作原理与编写以下代码相同:
#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)
例如:
#pragma warning(suppress:0000) // (suppress one error in the next line)
此pragma对Visual Studio 2005开始的C++有效。pragma对于通过Visual Studio 2005到Visual Studio 2015的C#无效。
错误:“预期禁用或恢复”。
(我想他们从来没有想到实施
suppress
…)C#需要不同的格式。它看起来像这样(但不起作用): 您必须禁用和启用,而不是
抑制
:
if (condition)
#pragma warning disable 0642
; // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else
这太难看了,我认为重新设计更明智:
if (condition)
{
// Do nothing (because blah blah blah).
}
else
正如@rampion提到的,如果您在clang gcc中,警告是按名称而不是按编号显示的,您需要执行以下操作:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop
此信息来自此问题被列为最受欢迎的三大问题之一,因此我在这里添加此答案,因为我找到了答案,希望帮助下一个人 如果您的警告/错误仅为
-Wunused
(或其子错误之一)或-Wunused-Werror
,则解决方案是强制转换为无效
:
对于-Wunused
或其子错误之一仅1,您可以将其强制转换为void
以禁用警告。这对于C和C++的编译器和IDE都适用。
1注1:例如,请参见此处的gcc文档,以获取这些警告的列表:,然后搜索短语“所有上述-Wunused选项组合”,并在此处查找主-Wunused
警告及其上方的子警告。-Wunused
包含的子警告包括:
-已使用但已设置参数
-已使用但已设置变量
-Wunused函数
-使用的标签
-使用的本地typedefs
-使用的参数
-Wno未使用的结果
-使用的变量
-使用的常量变量
-Wunused const variable=n
-使用的值
=包含上述所有-Wunused
组合选项-Wunused
void
以抑制此警告的示例:
//要保留的一些“未使用”变量
int-some_var=7;
//关闭此变量的`-Wunused`编译器警告
//把它扔到空的地方
(无效)某些_var;//如果只提到类型而不命名异常,则不会出现警告。例如,catch(const std::exception&/*unnamed*/){……}
。它不能回答您的问题,但可能会解决您的问题。谷歌搜索“如何抑制-c++中的Wunused结果”的标题位于此处,因此这里是针对该特定情况的答案:。这不是对该问题的回答。当然,这可能会解决OP的问题,但对未来的读者来说,一个类似的问题并没有帮助:“我如何关闭代码特定部分的特定警告?”@Sjoerd:有三个人已经回答了其他人可能搜索的“官方问题”,所以我试着在字里行间阅读并解决他的实际问题(在你发表评论一分钟后到达:
:P)@Sjoerd作为未来的读者,我证明这个答案确实对我有帮助。@Mołot:作为过去的作家,我很高兴它有帮助。=)10年后,我仍然没有使用例外。。。我经常使用(cl.exe)/kernel
开关编译。@Cookie:是的,它适用于
#pragma warning(suppress:0000) // (suppress one error in the next line)
#pragma warning suppress 0642 // (suppress one error in the next line)
if (condition)
#pragma warning disable 0642
; // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else
if (condition)
{
// Do nothing (because blah blah blah).
}
else
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop