2016-07-21 2 views
10

C++ 17 introduit l'attribut [[maybe_unused]].
Je suppose que c'est une version standardisée de GCC et Clang: __attribute__((unused)).est-ce que je mets [[peut-être inutilisé]] sur des déclarations de fonction ou des définitions?

Pour les fonctions inutilisées que je ne veux pas voir un avertissement,
dois-je spécifier l'attribut être sur

déclarations de fonction?

void maybe_used_function() [[maybe_unused]]; 

ou définitions de fonction?

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

L'un ou l'autre? Tous les deux?
L'effet sera-t-il le même sur les attributs standardisés et spécifiques au compilateur?
Je ne trouve pas de documentation claire sur le comportement du placement, et quelle est la pratique courante.


Lorsque je place l'attribut avant que le corps de la fonction dans une définition, GCC et clang donne une erreur:

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

avertissement: GCC ne permet pas l'attribut « utilisé » dans cette position sur une définition de fonction [-Wgcc-compat] fonction void() __attribute __ ((inutilisé)) {


Cependant, l'attribut peut être placé dans deux autres endroits sans erreur:

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

Peut-être un de ces moyens est de savoir comment je comptais utiliser l'attribut sur les définitions de fonction?

+0

Avez-vous * essayé * et vu ce que le compilateur dit réellement? AFAIK, les attributs vont sur les déclarations * seulement *, mais je n'ai pas revérifié le texte standard. –

+0

@JesperJuhl: Le compilateur est faux dans ce cas et ceci est loin d'être inhabituel, en particulier quand on parle de fonctionnalités de langage _upcoming_ qui peuvent ou non être implémentées correctement (ou pas du tout). – ildjarn

+0

@ildjarn l'erreur GCC provenait de '__attribute __ ((inutilisé))' pas '[[maybe_unused]]'. Clang semble faire la même chose. –

Répondre

5

De 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.

Depuis une définition de fonction est une déclaration ([dcl.dcl] ¶1), cela signifie que vous pouvez le mettre dans ces deux endroits et il se comportera de la même manière.

(Il est logique d'être admis dans les deux endroits puisque l'attribut n'affecte réellement la définition, mais parce que l'attribut peut servir d'auto-documentation, il est également autorisée sur la déclaration.)

19

Ni. Dans

[[attr1]] void [[attr2]] f [[attr3]]() [[attr4]] {} 
  • attr1 et attr3 se rapporter à (ou appliquer) à f lui-même.
  • attr2 appartient au type précédent, void.
  • attr4 appartient type de f ("fonction de () retour void), non f.

Vous voulez maybe_unused à appartiendront à f, vous pouvez le mettre en position 1 ou 3, mais pas 2 ou 4.

@ildjarn's answer couvre le reste.

pour GCC __attribute__, vous devrez vérifier sa documentation.