在 if 语句中沉默 -Wunused-variable

Silencing -Wunused-variable in an if statement

以下代码生成一个警告,指出 temp 未被使用(这是真的):

#include <cstdio>

int f() { return 5; }

int main() {
    if(const int& temp = f()) {
        printf("hello!\n");
    }

    return 0;
}

问题是我 需要 这样做而不用 gcc -Wall 和 clang -Weverything 生成警告(我正在实现类似的功能Catch) 的 SECTION() 内容。

那么有什么方法可以让它静音吗?我尝试使用 __attribute__((unused)).

全局使用 -Wno-unused-variable 对我来说不是一个选项,因为我正在编写一个仅 header 的库。

#include <cstdio>

int f() { return 5; }

int main()
{
  if (const int &temp __attribute__((unused)) = f()) {
    printf("hello!\n");
  }

  return 0;
}

这会消除 GCC 和 clang 的警告。

如果temp没有被使用,本质上也可能不需要。删除它。

#include <cstdio>

int f() { return 5; }

int main() {
    if(f()) {
        printf("hello!\n");
    }

    return 0;
}

我知道这是一个 MCVE,那么为什么它首先需要在那里?

正如您在评论中提到的,temp 的析构函数在目标代码 中很重要。添加一组额外的大括号将增加对临时生命周期的控制并确保其使用(因此删除警告);

#include <iostream>

using namespace std;

struct A {
    ~A() { cout << "~A()" << endl; }
    explicit operator bool() const { return true; }
};

A f() { return A{}; }

int main() {
    { // braced to limit scope...
        auto&& a = f(); // can be const A&
        if ( a ) {
            cout << "hello!" << endl;
        }
    } // braced to limit scope....
    return 0;
}

Demo code.

考虑到 temp 生命周期的附加限制已延长到关联 else 的末尾,只需强制关闭警告即可(编译器受限)。

if (const int &temp __attribute__((unused)) = f())

C++11 带来了 [[...]] 风格的属性,但是 unusednot standard, but clang does support this syntax [[gnu::unused]]

在尝试不使用 __attribute__((unused))(这是完全正确的解决方案)的情况下尝试解决这个问题后,我决定采用这个方法。

if(const int& temp = ((true) ? f() : (static_cast<void>(temp), f())) )

true 周围的括号抑制死代码警告,条件运算符在分配之前抑制关于使用 temp 的警告,并且转换为 void 删除未使用的变量警告。

gcc 的 -Wall 和 clang 的 -Weverything 没有什么可说的,尽管一个合理的人可能会。

公平警告:如果 temp 曾经用 volatile 复制构造函数声明 volatile,这将是 UB(关于何时发生左值到右值转换的一些神秘规则)。