当前位置:  开发笔记 > 编程语言 > 正文

处理C++"已初始化但未引用"警告是否会破坏范围助手?

如何解决《处理C++"已初始化但未引用"警告是否会破坏范围助手?》经验,为你挑选了2个好方法。

在Visual Studio中,我经常仅将对象用于RAII目的.例如:

ScopeGuard close_guard = MakeGuard( &close_file, file );

close_guard的全部目的是确保文件在函数退出时关闭,不在其他任何地方使用.但是,Visual Studio向我发出警告" 本地变量已初始化但未引用 ".我想针对这个特定情况关闭此警告.

你是如何处理这种情况的?Visual Studio认为这个对象没用,但这是错误的,因为它有一个非平凡的析构函数.

我不想为此使用#pragma警告指令,因为即使出于正当理由它也会关闭此警告.



1> Adam Rosenfi..:

如果您的对象具有非平凡的析构函数,则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;
}

评论析构函数会发出警告; 代码原样不是.



2> Jorge Ferrei..:

方法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++标准,使用临时值初始化的引用使该临时值在引用本身的生命周期中存活.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有