我有一些代码放在析构函数中,以确保它在正常退出和异常堆栈展开时运行:
struct withProtectedClose {
~withProtectedClose() {
// Do some cleanup here...
}
};
void test() {
withProtectedClose close;
// Do some work before closing
}
然而g ++编译器(g ++(GCC)3.4.6 20060404(Red Hat 3.4.6-11))抱怨道:
test.cpp: In function `void test()':
test.cpp:28: warning: unused variable 'close'
我可以通过某种方式引用变量来使它静音,但是这会使代码变得混乱,只会使编译器静音,而不是我希望我的代码受到影响。
不应该有一个析构函数的事实足以提示编译器,因为在构造之后没有使用变量没有区别吗?
假设编译器在仍然收到合法未使用变量的通知时无法关闭,有没有办法只使用它来使其静音?
答案 0 :(得分:2)
我倾向于认为这是编译器中的一个错误。它仍然存在于g ++ 4.7.1中。
作为一种解决方法,您可以尝试定义一个什么都不做的构造函数。它用g ++ 4.7.1来抑制警告,我不知道用3.4.6。
答案 1 :(得分:1)
由于它似乎只是一个GCC问题,你可以通过声明你的结构来“修复”它:
struct __attribute__ ((__unused__)) withProtectedClose
这可靠地使我的版本4.6.3编译器上的警告静音(并且根据标准证明析构函数是运行的)。但是,仍会警告您未使用的变量。
大多数情况下,你真的想知道这是一个错误,因此完全关闭警告(-Wno-unused-variable
)不是一个好的选择。如果没有其他原因,人们会想要(无意中)删除未使用的变量,因为它们会让阅读代码的人感到困惑,并给优化器带来了不必要的负担。
如果您需要可移植,请使用宏来封装属性内容(非GCC上的空宏)。
解决实际问题“编译器应该忽略导致构造函数或析构函数运行的未使用变量吗?” - 否。
C ++标准声明[3.7.3.3]:
如果具有自动存储持续时间的变量具有初始化或析构函数 有副作用,即使它似乎未被使用也不会被消除, 除了可以按照12.8中的规定消除类对象或其复制/移动。
就此而言,编译器不允许忽略变量。但是,允许警告某些通常是无意的事情。
答案 2 :(得分:0)
在这种情况下,MSVC不会发出此警告。如果您的gcc版本有,请尝试以这种方式抑制它:
withProtectedClose close;
(close);