有没有办法用visual studio禁用cpp文件中的单个警告线?
例如,如果我捕获异常并且不处理它,则会收到错误4101(未引用的局部变量)。有没有办法在该函数中忽略它,否则在编译单元中报告它?目前,我将#pragma warning (disable : 4101)
放在文件的顶部,但这显然只是将整个单元关闭。
答案 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
,您必须disable
和enable
:
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! ======
}