Reputation: 68618
Under gcc/g++ 4.9 I can write:
int x __attribute__((unused)) = f();
to indicate that x is intentionally unused.
Is it possible to do this with the C++11 [[]]
attribute notation somehow?
I tried:
int x [[unused]] = f();
but it doesn't work.
(Yes, I know it is an implementation-defined attribute.)
Upvotes: 33
Views: 35471
Reputation: 12058
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")]]
)C++ 17 is the version that introduces the required feature:
[[maybe_unused]]
(cppreference.com)Example from the link:
#include <cassert>
[[maybe_unused]] void f([[maybe_unused]] bool thing1,
[[maybe_unused]] bool thing2)
{
[[maybe_unused]] bool b = thing1 && thing2;
assert(b); // in release mode, assert is compiled out, and b is unused
// no warning because it is declared [[maybe_unused]]
} // parameters thing1 and thing2 are not used, no warning
So the answer is: no, it's not possible, using only C++11 features - the required C++ version to get this in a portable way is C++ 17.
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.
Upvotes: 15
Reputation: 1157
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);
}
Upvotes: 28
Reputation: 7429
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.
Upvotes: 28