scoped_lock如何避免发出“未使用的变量”警告?

时间:2011-09-14 15:03:37

标签: c++ boost g++ compiler-warnings

boost::mutex::scoped_lock是一个方便的RAII包装器,用于锁定互斥锁。我使用类似的技术来做其他事情:RAII包装器要求数据接口与串行设备分离/重新连接。

我无法弄清楚,为什么在下面的代码中只有我的对象mst - 其实例化和破坏确实有副作用 - 导致g++发出“未使用的变量”警告错误,而l设法保持沉默。

你知道吗?你能告诉我吗?

[generic@sentinel ~]$ cat test.cpp
#include <boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>

struct MyScopedThing;
struct MyWorkerObject {
    void a() { std::cout << "a"; }
    void b() { std::cout << "b"; }

    boost::shared_ptr<MyScopedThing> getScopedThing();
};

struct MyScopedThing {
    MyScopedThing(MyWorkerObject& w) : w(w) {
        w.a();
    }
    ~MyScopedThing() {
        w.b();
    }

    MyWorkerObject& w;
};

boost::shared_ptr<MyScopedThing> MyWorkerObject::getScopedThing() {
    return boost::shared_ptr<MyScopedThing>(new MyScopedThing(*this));
}

int main() {
    boost::mutex m;
    boost::mutex::scoped_lock l(m);

    MyWorkerObject w;
    const boost::shared_ptr<MyScopedThing>& mst = w.getScopedThing();
}


[generic@sentinel ~]$ g++ test.cpp -o test -lboost_thread -Wall
test.cpp: In function ‘int main()’:
test.cpp:33: warning: unused variable ‘mst’

[generic@sentinel ~]$ ./test
ab[generic@sentinel ~]$ g++ -v 2>&1 | grep version
gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC)

3 个答案:

答案 0 :(得分:6)

请注意,自编写其他答案以来,问题已发生变化。

可能g ++没有在当前形式中警告的原因是因为mst是一个引用,构造和破坏引用没有副作用。确实,这里的引用是延长临时的生命周期,它在构造函数和析构函数中有效,但显然g ++并没有意识到这会产生影响。

答案 1 :(得分:1)

如果我的记忆对我有用,那么根据优化设置,g ++有不同的发送unused variable错误的习惯,因为检测工作在优化器级别。

也就是说,代码是以SSA形式优化的,如果优化器检测到优化后的变量未使用,那么它可能会发出警告(我更喜欢Clang分析......)。 p>

因此,这可能是检测析构函数的作用。我想知道如果析构函数的定义是离线的,它是否需要保守的方法,我猜想这等于函数调用然后this有资格作为变量的使用。

答案 2 :(得分:0)

我怀疑原因是你的班级很琐碎 析构函数,并且g ++仅警告未使用的变量if 析构函数是微不足道的。调用一个非平凡的析构函数是一个 “使用”。