Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

do I put [[maybe unused]] on function declarations or definitions?

C++17 introduces the attribute [[maybe_unused]].
I assume this a standardized version of GCC and Clang's: __attribute__((unused)).

For unused functions that I don't want to see a warning from,
should I be specifying the attribute on

function declarations?

void maybe_used_function() [[maybe_unused]];

or function definitions?

void maybe_used_function() [[maybe_unused]] {
  /* impl */
}

Either one? Both?
Will the effect be the same on both the standardized and compiler specific attributes?
I can't find any clear documentation on placement behaviour, and what the common practice is.


When I place the attribute before the function body in a definition, GCC and clang give an error:

void function();
int main(){}
void function() __attribute__((unused)) {}  

warning: GCC does not allow 'unused' attribute in this position on a function definition [-Wgcc-compat] void function() __attribute__((unused)) {


However, the attribute can be placed in two other places without error:

__attribute__((unused)) void __attribute__((unused)) function() {}

Maybe one of these ways is how I'm expected to use the attribute on function definitions?

like image 607
Trevor Hickey Avatar asked Jul 21 '16 20:07

Trevor Hickey


People also ask

What does [[ Nodiscard ]] do?

The [[nodiscard]] attribute can be used to indicate that the return value of a function shouldn't be ignored when you do a function call. If the return value is ignored, the compiler should give a warning on this.

What is __ attribute __ in C?

The __attribute__ directive is used to decorate a code declaration in C, C++ and Objective-C programming languages. This gives the declared code additional attributes that would help the compiler incorporate optimizations or elicit useful warnings to the consumer of that code.


1 Answers

Neither. In

[[attr1]] void [[attr2]] f [[attr3]] () [[attr4]] {}
  • attr1 and attr3 appertain (or apply) to f itself.
  • attr2 appertains to the preceding type, void.
  • attr4 appertains to f's type ("function of () returning void), not f.

You want maybe_unused to appertain to f, so you can put it in position 1 or 3, but not 2 or 4.

@ildjarn's answer covers the rest.

For GCC's __attribute__, you'll have to check its documentation.

like image 132
T.C. Avatar answered Nov 07 '22 17:11

T.C.