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

时间:2015-08-09 22:56:47

标签: c++ c++11 gcc

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

int x __attribute__((unused)) = f();

表示有意使用x。

是否可以以某种方式使用C ++ 11 [[]]属性表示法执行此操作?

我试过了:

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

但它没有用。

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

3 个答案:

答案 0 :(得分:14)

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

就像已经说过unused不是标准指定的standard attributes的一部分。

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

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

example without gnu prefix

example with gnu prefix

答案 1 :(得分:9)

你指的是attribute specifiers。它试图标准化各种依赖于平台的说明符:

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

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

并在C ++ 14中:

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

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

如果您对便携式解决方案中不感兴趣,可能会有一种方法。 C ++标准不限制此列表:

  

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

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

  • [[gnu::unused]]

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

答案 2 :(得分:9)

C ++ 17中有[[maybe_unused]]属性。它在GCC 7中实现,请参阅C++ Standards Support in GCC

来自P0212R1 proposal的示例:

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