禁用单个警告错误

时间:2011-08-23 10:06:31

标签: c++ visual-c++ warnings pragma

有没有办法用visual studio禁用cpp文件中的单个警告线?

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

11 个答案:

答案 0 :(得分:148)

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

答案 1 :(得分:67)

如果您只想在一行代码中取消警告,则可以使用suppress warning specifier

#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)

答案 2 :(得分:26)

#pragma push / pop通常是解决此类问题的方法,但在这种情况下,为什么不删除未引用的变量?

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

答案 3 :(得分:9)

使用#pragma warning ( push ),然后#pragma warning ( disable ),然后输入您的代码,然后按照here所述使用#pragma warning ( pop )

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

答案 4 :(得分:4)

不要将它放在文件的顶部(甚至是头文件),而是使用#pragma warning (push)#pragma warning (disable)和匹配的#pragma warning (pop)来包装相关代码,如图所示{ {3}}

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

答案 5 :(得分:4)

也可以使用UNREFERENCED_PARAMETER中定义的WinNT.H。定义只是:

#define UNREFERENCED_PARAMETER(P)          (P)

并使用它:

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

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

某些静态代码分析可能仍会对此非荒谬的声明(wParam;)发出警告。在这种情况下,您可以在调试版本中使用与DBG_UNREFERENCED_PARAMETER相同的UNREFERENCED_PARAMETER,在版本构建中使用P=P

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

答案 6 :(得分:3)

示例:

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

此编译指示对于从Visual Studio 2005开始的 C ++ 有效 https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

该编译指示通过Visual Studio 2005到Visual Studio 2015对 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

答案 7 :(得分:2)

在某些情况下,必须具有命名参数,但您不能直接使用它 例如,我在VS2010上遇到过它,当'e'仅在decltype语句中使用时,编译器会抱怨,但你必须有名为varible e

所有上述非#pragma建议都归结为只添加一条声明:

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

答案 8 :(得分:2)

如@rampion所述,如果您使用的是clang gcc,则警告是按名称而不是数字进行的,您需要执行以下操作:

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

此信息来自here

答案 9 :(得分:1)

如果要禁用unreferenced local variable写入某些标题

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

并使用

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

答案 10 :(得分:0)

这个问题是Google search for "how to suppress -Wunused-result in c++"的前三名命中之一,因此我在这里添加了这个答案,因为我已经弄清楚了,并希望帮助下一个人。

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

仅对于-Wunused或其子错误之一 1 ,您可以将其强制转换为void以禁用警告。这对于任何编译器和C和C ++的任何IDE都适用。

1 注1:例如,请参阅gcc文档,以获取以下警告列表:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html,然后搜索短语“以上所有-Wunused选项组合在一起”,然后在此处查找主要的-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]]的变量的函数:

C ++属性:nodiscard(自C ++ 17起)
如果从除强制转换为void之外的其他废弃值表达式中调用了声明为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! ======
}