C++11-style [[unused]] attribute in gcc?

后端 未结 3 1120
眼角桃花
眼角桃花 2021-01-01 12:59

Under gcc/g++ 4.9 I can write:

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

to indicate that x is intentionally unused.

Is it possible to d

相关标签:
3条回答
  • 2021-01-01 13:16

    Yes, use [[gnu::unused]]

    Like already said unused isn't part of the standard attributes specified by the standard.

    The standard allows implementation defined attributes too like the __attribute__ and __declspec ones to be used with the new syntax. If a compiler doesn't recognize an attribute (a gcc attribute when compiling on MSVC as example) it'll simply be ignored. (probably with a warning)

    For gcc you can use the gnu prefix and the C++11 attribute syntax: [[gnu::unused]] instead of __attribute__((unused)) the same should apply for the other gcc attributes too.

    example without gnu prefix

    example with gnu prefix

    0 讨论(0)
  • 2021-01-01 13:23

    The thing you are referring to is known as attribute specifiers. It is an attempt to standardize various, platform dependent, specifiers:

    • __attribute__ in case of GCC / ICC (Linux)
    • __declspec on MSVC / ICC (Windows)

    As you can see in attached doc link, the only specifiers supported in C++11 are:

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

    and in C++14:

    • [[deprecated]] (also supported as: [[deprecated("reason")]])

    So the answer is: no, it's not possible, using only C++11 features.


    If you are not interested only in portable solutions, there might be a way. C++ standard does not limit this list:

    Only the following attributes are defined by the C++ standard. All other attributes are implementation-specific.

    Various compilers can support some non-standard specifiers. For example, you can read this page in order to find out, that Clang supports:

    • [[gnu::unused]]

    Perhaps your version of GCC also supports this specifier. This page contains a bug report referring to generalized attributes support. [[gnu::unused]] is also mentioned.

    0 讨论(0)
  • 2021-01-01 13:40

    There is [[maybe_unused]] attribute in C++17. It's implemented in GCC 7, see C++ Standards Support in GCC .

    Example from P0212R1 proposal:

    [[maybe_unused]] void f([[maybe_unused]] bool thing1,
                            [[maybe_unused]] bool thing2) {
        [[maybe_unused]] bool b = thing1 && thing2;
        assert(b);
    }
    
    0 讨论(0)
提交回复
热议问题