2016-07-21 10 views
10

C++ 17 führt das Attribut [[maybe_unused]] ein.
Ich nehme an, dies ist eine standardisierte Version von GCC und Clang: __attribute__((unused)).setze ich [[vielleicht unbenutzt]] auf Funktionsdeklarationen oder Definitionen?

Für nicht genutzte Funktionen, die ich will nicht von einer Warnung, um zu sehen,
sollte ich auf

Funktionsdeklarationen das Attribut sein Angabe?

void maybe_used_function() [[maybe_unused]]; 

oder Funktionsdefinitionen?

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

Entweder? Beide?
Wird der Effekt sowohl bei den standardisierten als auch bei den compilerspezifischen Attributen gleich sein?
Ich kann keine klare Dokumentation über das Vermittlungsverhalten finden und was die übliche Praxis ist.


Wenn ich stelle das Attribut vor dem Funktionskörper in einer Definition, GCC und Klirren einem Fehler geben:

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

Warnung: GCC nicht erlaubt 'ungenutzt' -Attribut in dieser Position auf eine Funktionsdefinition [-Wgcc-compat] Leere function() __attribute __ ((ungebraucht)) {


Allerdings kann das Attribut in zwei anderen Orten ohne Fehler gesetzt werden:

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

Vielleicht eine dieser Möglichkeiten, wie ich erwartet, dass das Attribut Funktionsdefinitionen benutzen?

+0

Haben Sie * versucht * und sehen, was der Compiler eigentlich sagt? AFAIK, die Attribute gehen auf die Deklarationen * nur *, aber ich habe den Standardtext nicht doppelt überprüft. –

+0

@JesperJuhl: Der Compiler ist in diesem Fall falsch, und dies ist alles andere als ungewöhnlich, besonders bei der Diskussion von _upcoming_ Sprachfeatures, die möglicherweise (oder überhaupt nicht) korrekt implementiert wurden. – ildjarn

+0

@ildjarn der GCC-Fehler kam von '__attribute __ ((unbenutzt))' nicht '[[may_unused]]'. Clang scheint das Gleiche zu tun. –

Antwort

5

Von N4606 [dcl.attr.unused] ¶4:

A name or entity declared without the maybe_unused attribute can later be redeclared with the attribute and vice versa. An entity is considered marked after the first declaration that marks it.

Da eine Funktionsdefinition eine Erklärung ([dcl.dcl] ¶1) ist, dann können Sie es in beiden Orten setzen können und es wird sich genauso verhalten.

(Es macht Sinn, in beiden Orten erlaubt zu werden, da nur das Attribut tatsächlich dieDefinition betrifft, sondern weil das Attribut als Selbstdokumentation dienen kann, ist es auch erlaubt auf der Erklärung.)

19

Weder. In

[[attr1]] void [[attr2]] f [[attr3]]() [[attr4]] {} 
  • attr1 und attr3 appertain (oder) gelten für f selbst.
  • attr2 gehört zum vorhergehenden Typ, void.
  • attr4 appertains zu f ‚s-Typ (" Funktion von ()void zurückkehrt), nicht f.

Sie maybe_unused wollen f, appertain, so dass Sie sie in Position 1 oder 3 setzen können, aber nicht 2 oder 4.

@ildjarn's answer deckt den Rest.

Für GCC __attribute__, müssen Sie seine Dokumentation überprüfen.

Verwandte Themen