gcc中的C++11风格的[[unused]]属性是什么?

32
在gcc/g++ 4.9版本下,我可以编写:
int x __attribute__((unused)) = f();

用来表示 x 是有意未使用的。

在 C++11 中的 [[]] 属性符号能否以某种方式实现这一点?

我尝试过:

int x [[unused]] = f();

但它并不能工作。

(是的,我知道这是一个实现定义的属性。)


你为什么认为它会起作用?你看到任何语言规范了吗? - SwiftMango
不,它不起作用。这只是gcc的扩展,而不是语言规范。 - SwiftMango
它并不完美地回答了你的问题,但是我的下面评论可能会引起你的兴趣。 - Shafik Yaghmour
3个回答

28

C++17中有[[maybe_unused]]属性。它在GCC 7中实现,详见GCC中的C++标准支持

来自P0212R1提案的示例:

[[maybe_unused]] void f([[maybe_unused]] bool thing1,
                        [[maybe_unused]] bool thing2) {
    [[maybe_unused]] bool b = thing1 && thing2;
    assert(b);
}

27

是的,使用[[gnu::unused]]

如前所述,unused不是标准规定的标准属性之一。

标准允许使用实现定义的属性,例如__attribute____declspec等,与新语法一起使用。如果编译器无法识别属性(例如在MSVC上编译时的gcc属性),则将简单地忽略它(可能会产生警告)。

对于gcc,您可以使用gnu前缀和C ++11属性语法:[[gnu::unused]]而不是__attribute__((unused))。其他gcc属性也应该适用。

没有gnu前缀的示例

带有gnu前缀的示例


太好了,使用gcc可以这样写:X x [[gnu::unused]] = y; - Aelian

14
你所指的是属性说明符,它是一种试图标准化各种平台相关说明符的方法:

正如附加文档链接中所示,C++11 中仅支持以下说明符:

  • [[noreturn]]
  • [[carries_dependency]]

而在 C++14 中:

  • [[deprecated]](也支持:[[deprecated("reason")]]

C++17 是引入所需功能的版本:

来自链接的示例:

#include <cassert>
 
[[maybe_unused]] void f([[maybe_unused]] bool thing1,
                        [[maybe_unused]] bool thing2)
{
    [[maybe_unused]] bool b = thing1 && thing2;
    assert(b); // in release mode, assert is compiled out, and b is unused
               // no warning because it is declared [[maybe_unused]]
} // parameters thing1 and thing2 are not used, no warning

所以答案是:不行,仅使用C++11特性是不可能的 - 要以可移植的方式获得此功能所需的C++版本是C++17。

如果你不仅仅对可移植解决方案感兴趣,那么可能有一种方法。C++标准没有限制以下列表:

只有C++标准定义了以下属性。所有其他属性都是特定于实现的。

各种编译器可以支持一些非标准的说明符。例如,您可以阅读this page以查找Clang支持的内容:

  • [[gnu::unused]]

也许您的GCC版本也支持此说明符。This page包含一个引用广义属性支持的错误报告。[[gnu::unused]]也被提到。


Ben Deane提出了一个有趣的C++11解决方案,我在这里添加了一个答案,它显然依赖于优化器,但我还没有看到一个不做正确事情的。 - Shafik Yaghmour
@ShafikYaghmour 有趣的想法,但我认为这不是一个好的解决方案。在这种情况下,它可能会被优化掉,也可能不会。unused属性更明确、可预测。此外,每个已知的平台都有某种形式的unused,因此最好的多平台解决方案是使用#ifdef和所有平台的公共宏——这可能是最好的可能解决方案(直到更多属性被标准化)。 - Mateusz Grzejek
如果它没有被正确地优化掉,我可能会提交一个错误报告。虽然我不确定我会使用那个技巧,但记录它是值得的,因为它可能对其他人非常有用。 - Shafik Yaghmour
C++17(C++1z)有什么变化吗? - Macxx
编辑队列已满,所以我无法做任何事情,但是 MSDN 链接目前重定向到 https://learn.microsoft.com/en-us/previous-versions/dabb5z75(v=vs.140)?redirectedfrom=MSDN ,当再次可以进行编辑时应该更新。 - AJM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接