禁用单个警告错误

有没有一种方法可以禁用 cpp 文件中的一个警告线与视觉工作室?

例如,如果我捕获了一个异常,但是没有处理它,就会得到错误4101(未引用的局部变量)。有没有办法只在那个函数中忽略它,而在编译单元中报告它?目前,我把 #pragma warning (disable : 4101)放在文件的顶部,但这显然只是关闭了整个单元。

175755 次浏览

不要将它放在文件的顶部(甚至是头文件) ,只要将有问题的代码用 #pragma warning (push)#pragma warning (disable)和匹配的 #pragma warning (pop)包装起来,如 给你所示。

尽管还有其他一些选项,包括 #pramga warning (once)

#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop )

使用 #pragma warning ( push ),然后使用 #pragma warning ( disable ),然后输入代码,然后按照 给你所述使用 #pragma warning ( pop ):

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop )

#pragma推/弹出通常是这类问题的解决方案,但在这种情况下,为什么不删除未引用的变量呢?

try
{
// ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
// ...
}

如果要禁用 unreferenced local variable,请在某个标题中写入

template<class T>
void ignore (const T & ) {}

和使用

catch(const Except & excpt) {
ignore(excpt); // No warning
// ...
}

也可以使用 WinNT.H中定义的 UNREFERENCED_PARAMETER,定义如下:

#define UNREFERENCED_PARAMETER(P)          (P)

像这样使用它:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam);
}

为什么要使用它,你可能会争辩说,你可以省略变量名本身。有些情况下(不同的项目配置、调试/发布版本)可能会真正使用变量。在另一个配置中,该变量未使用(因此有警告)。

一些静态程序分析可能仍然会对这种无意义的说法提出警告(wParam;)。在这种情况下,您可以在调试构建中使用与 UNREFERENCED_PARAMETER相同的 DBG_UNREFERENCED_PARAMETER,在发布构建中使用 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
}

如果您只想在一行代码中禁止显示警告(预处理后)[1] ,可以使用 suppress 警告说明书:

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

对于单行代码,其工作原理与编写以下代码相同:

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

[1]其他人在下面的评论中指出,如果下面的语句是 # include 语句,那么 # 杂注警告(抑制: 4101)语句将不会有效地抑制头文件中每一行的警告。如果有人打算这样做,那么就需要使用推/禁用/弹出方法来代替。

例如:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

此杂注对于从 VisualStudio2005开始的 C + + 是有效的。
Https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

该杂注对于从 VisualStudio2005到 VisualStudio2015的 C # 无效。
错误: “预期禁用或还原”。
(我猜他们从来没有实现过 suppress... ...)
Https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

C # 需要一种不同的格式,它看起来像这样(但不能工作) :

#pragma warning suppress 0642  // (suppress one error in the next line)

取代 suppress,你必须使用 disableenable:

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

正如@ramion 提到的,如果你在 clang gcc 中,警告是按名字而不是按号码,你需要做的是:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

这个信息来自 给你

这个问题是 谷歌搜索“如何在 c + + 中禁用-未使用-结果”排名前三的问题之一,所以我在这里加上这个答案,因为我弄明白了,想帮助下一个人。

如果您的警告/错误是 -Wunused(或其子错误之一)或 -Wunused -Werror 只有,解决方案是转换为 void:

对于 -Wunused或其中一个子错误,只需将其强制转换为 void,即可禁用警告。这对于任何编译器和任何 IDE (C 和 C + +)都适用。

1 注1: 参见 gcc 文档这里,例如,这些警告的列表: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html,然后搜索短语“所有以上-未使用的选项组合”,并在那里寻找主要的 -Wunused警告和它的子警告。-Wunused包含的子警告包括:

  • -Wunused-but-set-parameter
  • -Wunused-but-set-variable
  • -Wunused-function
  • -Wunused-label
  • -Wunused-local-typedefs
  • -Wunused-parameter
  • -Wno-unused-result
  • -Wunused-variable
  • -Wunused-const-variable
  • -Wunused-const-variable=n
  • -Wunused-value
  • -Wunused = 包含上述所有 -Wunused选项的组合

void强制转换以禁止此警告的示例:

// some "unused" variable you want to keep around
int some_var = 7;
// turn off `-Wunused` compiler warning for this one variable
// by casting it to void
(void)some_var;  // <===== SOLUTION! ======

对于 C + + ,这也适用于返回标记为 [[nodiscard]]的变量的函数:

属性: nodiscard (从 C + + 17开始)
如果声明 nodiscard 的函数或返回按值声明 nodiscard 的枚举或类的函数从非强制转换的丢弃值表达式中调用,则鼓励编译器发出警告。
(资料来源: https://en.cppreference.com/w/cpp/language/attributes/nodiscard)

因此,解决方案是将函数调用强制转换为 void,因为这实际上是将 函数返回的值(用 [[nodiscard]]属性标记)强制转换为 void

例如:

// Some class or struct marked with the C++ `[[nodiscard]]` attribute
class [[nodiscard]] MyNodiscardClass
{
public:
// fill in class details here
private:
// fill in class details here
};


// Some function which returns a variable previously marked with
// with the C++ `[[nodiscard]]` attribute
MyNodiscardClass MyFunc()
{
MyNodiscardClass myNodiscardClass;
return myNodiscardClass;
}


int main(int argc, char *argv[])
{
// THE COMPILER WILL COMPLAIN ABOUT THIS FUNCTION CALL
// IF YOU HAVE `-Wunused` turned on, since you are
// discarding a "nodiscard" return type by calling this
// function and not using its returned value!
MyFunc();


// This is ok, however, as casing the returned value to
// `void` suppresses this `-Wunused` warning!
(void)MyFunc();  // <===== SOLUTION! ======
}

最后,还可以使用 C + + 17[[maybe_unused]]属性: https://en.cppreference.com/w/cpp/language/attributes/maybe_unused