在gcc / g ++ 4.9下我可以写:
int x __attribute__((unused)) = f();
表示有意使用x。
是否可以以某种方式使用C ++ 11 [[]]
属性表示法执行此操作?
我试过了:
int x [[unused]] = f();
但它没有用。
(是的,我知道它是一个实现定义的属性。)
答案 0 :(得分:14)
是的,请使用[[gnu::unused]]
就像已经说过unused
不是标准指定的standard attributes的一部分。
该标准允许实现定义的属性,就像__attribute__
和__declspec
一样,可以与新语法一起使用。如果编译器无法识别属性(例如在MSVC上编译时的gcc属性),则只会忽略它。 (可能有警告)
对于gcc,您可以使用gnu前缀和C ++ 11属性语法:[[gnu::unused]]
而不是__attribute__((unused))
同样适用于其他gcc属性。
答案 1 :(得分:9)
你指的是attribute specifiers。它试图标准化各种依赖于平台的说明符:
__attribute__
如果是 GCC / ICC(Linux) __declspec
MSVC / ICC(Windows) 正如您在附加的文档链接中所看到的,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);
}