【问题标题】:C++11-style [[unused]] attribute in gcc?gcc中的C ++ 11样式[[未使用]]属性?
【发布时间】:2015-08-09 22:56:47
【问题描述】:

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

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

表示 x 是故意未使用的。

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

我试过了:

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

但它不起作用。

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

【问题讨论】:

  • 你为什么认为它会起作用?您看到任何语言规范了吗?
  • 不,它不起作用。它只是 gcc 扩展。不是语言规范
  • 它不完全适合您的问题作为答案,但 my comment below 可能会让您感兴趣。

标签: c++ c++11 gcc


【解决方案1】:

是的,使用[[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

【讨论】:

  • 太好了,有了这个 gcc 允许语法:X x [[gnu::unused]] = y;
【解决方案2】:

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);
}

【讨论】:

    【解决方案3】:

    您所指的是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]]

    【讨论】:

    • Ben Deane 提出了一个有趣的 C++11 解决方案,我将其添加为 answer here,它显然依赖于优化器,但我还没有看到没有做正确的事情。
    • @ShafikYaghmour 有趣的想法,虽然我认为这不是一个好的解决方案。在这种情况下,它可能或可能不被优化。 unused 属性更加明确和可预测。此外,每个已知平台都有某种形式的 unused,所以最好的 multiplatform 解决方案是 #ifdef 和所有平台的通用宏 - 它可能是最好的解决方案(直到更多属性标准化)。
    • 如果没有正确优化,我可能会提交错误报告,我不确定我是否会使用该技巧,但值得记录它可能最终对其他人非常有用。
    • C++17(C++1z)有什么变化吗?
    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多