C++ 编译器是否应该忽略导致运行构造函数或析构函数的未使用变量?

C++ 编译器是否应该忽略导致运行构造函数或析构函数的未使用变量?,c++,g++,destructor,compiler-warnings,unused-variables,C++,G++,Destructor,Compiler Warnings,Unused Variables,我在析构函数中放入了一些代码,以确保它在正常退出和异常堆栈展开时都运行: 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

我在析构函数中放入了一些代码,以确保它在正常退出和异常堆栈展开时都运行:

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'
我可以通过引用变量使其静音,但这只会使编译器静音,而不会影响我的代码

有一个析构函数这一事实难道不足以提示编译器,在构造后不使用变量并没有什么区别吗


假设编译器无法关闭,同时仍然会收到合法未使用变量的通知,那么除了使用它之外,有没有其他方法可以使此变量静音?

我倾向于认为这是编译器中的一个错误。它仍然存在于g++4.7.1中


作为一种解决方法,您可以尝试定义一个什么都不做的构造函数。它用g++4.7.1抑制警告,我不知道用3.4.6。

MSVC在这种情况下不会发出此警告。如果您的gcc版本确实如此,请尝试通过以下方式抑制它:

withProtectedClose close; 
(close); 

由于这似乎只是一个GCC问题,您可以通过如下方式声明结构来“修复”它:

struct __attribute__ ((__unused__)) withProtectedClose
这可靠地消除了我的4.6.3版编译器上的警告(并且可以证明析构函数是按照标准运行的)。但是,它仍会警告您未使用的变量,否则

大多数情况下,这是一个您真正想知道的错误,因此同时关闭警告(
-Wno unused variable
)不是一个好的选择。如果没有其他原因,人们会希望删除(无意中)未使用的变量,因为它们会让阅读代码的人感到困惑,并给优化器带来不必要的负担

如果需要可移植,可以使用宏来封装属性stuff(非GCC上的空宏)

要解决实际问题“编译器是否应该忽略导致运行构造函数或析构函数的未使用变量?”--
否。

C++标准状态[3.7.3.3]:

如果具有自动存储持续时间的变量具有初始化或析构函数 有副作用的,即使看起来未使用,也不能消除, 除类对象或其复制/移动可按照12.8中的规定消除外

到目前为止,编译器不允许忽略该变量。然而,它被允许对经常是无意的事情发出警告