在Visual Studio中,我经常仅将对象用于RAII目的.例如:
ScopeGuard close_guard = MakeGuard( &close_file, file );
close_guard的全部目的是确保文件在函数退出时关闭,不在其他任何地方使用.但是,Visual Studio向我发出警告" 本地变量已初始化但未引用 ".我想针对这个特定情况关闭此警告.
你是如何处理这种情况的?Visual Studio认为这个对象没用,但这是错误的,因为它有一个非平凡的析构函数.
我不想为此使用#pragma警告指令,因为即使出于正当理由它也会关闭此警告.
如果您的对象具有非平凡的析构函数,则Visual Studio 不应该向您发出该警告.以下代码不会在VS2005中生成任何警告,警告会一直向上(/ W4):
class Test { public: ~Test(void) { printf("destructor\n"); } }; Test foo(void) { return Test(); } int main(void) { Test t = foo(); printf("moo\n"); return 0; }
评论析构函数会发出警告; 代码原样不是.
方法1:使用该#pragma warning
指令.
#pragma warning
允许选择性地修改编译器警告消息的行为.
#pragma warning( push ) #pragma warning( disable : 4705 ) // replace 4705 with warning number ScopeGuard close_guard = MakeGuard( &close_file, file ); #pragma warning( pop )
此代码保存当前警告状态,然后禁用特定警告代码的警告,然后恢复上次保存的警告状态.
方法2:使用如下所示的解决方法.Visual Studio会很开心,你也会这样.此解决方法用于许多Microsoft示例以及其他项目中.
ScopeGuard close_guard = MakeGuard( &close_file, file ); close_guard;
或者您可以创建一个#define
解决方法来解决警告.
#define UNUSED_VAR(VAR) VAR ... ScopeGuard close_guard = MakeGuard( &close_file, file ); UNUSED_VAR(close_guard);
一些用户声称所提供的代码不起作用,因为ScopeGuard是一个typedef.这个假设是错误的.
http://www.ddj.com/cpp/184403758
根据C++标准,使用临时值初始化的引用使该临时值在引用本身的生命周期中存活.