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

And*_*zos 18 c++ gcc c++11

在gcc/g ++ 4.9下我可以写:

int x __attribute__((unused)) = f();
Run Code Online (Sandbox Code Playgroud)

表示x是故意未使用的.

是否有可能以[[]]某种方式使用C++ 11 属性表示法?

我试过了:

int x [[unused]] = f();
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

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

use*_*027 18

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

就像已经说过的那样,unused它不是标准规定的标准属性的一部分.

该标准允许实现定义的属性,就像__attribute____declspec新语法一样使用.如果编译器无法识别属性(例如在MSVC上编译时的gcc属性),则只会忽略它.(可能有警告)

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

没有gnu前缀的示例

使用gnu前缀的示例


Ala*_*kov 13

[[maybe_unused]]C++ 17中有属性.它在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)?
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*jek 10

你所指的东西称为属性说明符.它试图标准化各种依赖于平台的说明符:

正如您在附加的文档链接中看到的那样,C++ 11中唯一支持的说明符是:

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

在C++ 14中:

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

所以答案是:不,这是不可能的,仅使用C++ 11功能.


如果你没有兴趣在便携式解决方案,有可能是一个办法.C++标准不限制此列表:

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

各种编译器可以支持一些非标准的说明符.例如,您可以阅读此页面以了解Clang支持的内容:

  • [[gnu::unused]]

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