C++ 禁用单一警告错误

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警告(

有没有办法在VisualStudio中仅禁用cpp文件中的一条警告行


例如,如果我捕获到一个异常而不处理它,我会得到错误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