4

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

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'

我可以通过以某种方式引用变量来使其静音,但这只会使代码变得混乱以使编译器静音,而不是我希望我的代码受到影响。

有一个析构函数的事实不应该足以提示编译器,因为在构造后没有使用变量没有区别吗?

假设编译器在仍然收到合法未使用变量的通知时无法关闭,除了使用它之外,有没有办法让这个编译器静音?

4

3 回答 3

2

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

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

于 2012-09-11T14:32:11.587 回答
1

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

struct __attribute__ ((__unused__)) withProtectedClose

这可靠地消除了我的版本 4.6.3 编译器上的警告(并且根据标准,析构函数明显运行)。但是,它仍会警告您未使用的变量,否则。

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

如果您需要可移植,请使用宏来封装属性内容(非 GCC 上的空宏)。

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

C++ 标准规定 [3.7.3.3]:

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

在此范围内,不允许编译器忽略变量。但是,它可以警告通常是无意的事情。

于 2012-09-11T15:37:53.430 回答
0

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

withProtectedClose close; 
(close); 
于 2012-09-11T14:34:35.490 回答