禁用作用域防护的"Unused variable"

Disable "Unused variable" for ScopedGuard

本文关键字:Unused variable 作用域      更新时间:2023-10-16

我正在与安德烈·亚历山德雷斯库和彼得鲁·边缘安一起玩 范围警卫对象

当你用-Wall -Werror编译它时,你会得到"未使用的变量"错误。以下代码取自 LOKI

    class ScopeGuardImplBase
{
    ScopeGuardImplBase& operator =(const ScopeGuardImplBase&);
protected:
    ~ScopeGuardImplBase()
    {}
    ScopeGuardImplBase(const ScopeGuardImplBase& other) throw() 
        : dismissed_(other.dismissed_)
    {
        other.Dismiss();
    }
    template <typename J>
    static void SafeExecute(J& j) throw() 
    {
        if (!j.dismissed_)
            try
            {
                j.Execute();
            }
            catch(...)
            {}
    }
    mutable bool dismissed_;
public:
    ScopeGuardImplBase() throw() : dismissed_(false) 
    {}
    void Dismiss() const throw() 
    {
        dismissed_ = true;
    }
};
////////////////////////////////////////////////////////////////
///
/// typedef typedef const ScopeGuardImplBase& ScopeGuard
/// ingroup ExceptionGroup
///
/// See Andrei's and Petru Marginean's CUJ article
/// http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/alexandr.htm
///
/// Changes to the original code by Joshua Lehrer:
/// http://www.lehrerfamily.com/scopeguard.html
////////////////////////////////////////////////////////////////
typedef const ScopeGuardImplBase& ScopeGuard;
template <typename F>
class ScopeGuardImpl0 : public ScopeGuardImplBase
{
public:
    static ScopeGuardImpl0<F> MakeGuard(F fun)
    {
        return ScopeGuardImpl0<F>(fun);
    }
    ~ScopeGuardImpl0() throw() 
    {
        SafeExecute(*this);
    }
    void Execute() 
    {
        fun_();
    }
protected:
    ScopeGuardImpl0(F fun) : fun_(fun) 
    {}
    F fun_;
};
template <typename F> 
inline ScopeGuardImpl0<F> MakeGuard(F fun)
{
    return ScopeGuardImpl0<F>::MakeGuard(fun);
}

问题出在用法上:

ScopeGuard scope_guard = MakeGuard(&foo);

这只是

const ScopeGuardImplBase& scope_guard = ScopeGuardImpl0<void(*)()>(&foo);

我使用宏在应对结束时获得一些操作:

#define SCOPE_GUARD ScopedGuard scope_guard = MakeGuard

这样,用户只需调用

SCOPE_GUARD(&foo, param) ...

此宏使禁用未使用的警告变得困难。

有人可以帮助我更好地理解这一点,并在不使用 -Wno-unused-variable 的情况下提供解决方案吗?

您可以尝试旧方法:

 (void)scope_guard;