Namespaces
Variants

Attribute specifier sequence (since C23)

From cppreference.net

Introduit des attributs définis par l'implémentation pour les types, les objets, les expressions, etc.

Table des matières

Syntaxe

[[ attr  ]] [[ attr1 , attr2 , attr3 ( args ) ]] [[ attribute-prefix :: attr  ( args ) ]]

Formellement, la syntaxe est

[[ liste-d'attributs ]] (depuis C23)

attribute-list est une séquence séparée par des virgules de zéro ou plusieurs attribute-token s

attribut-standard (1)
préfixe-attribut :: identifiant (2)
attribut-standard ( liste-arguments  (optionnel) ) (3)
préfixe-attribut :: identifiant ( liste-arguments  (optionnel) ) (4)

attribute-prefix est un identifier et argument-list est une séquence de jetons où les parenthèses, crochets et accolades sont équilibrés ( balanced-token-sequence ).

1) attribut standard, tel que [ [ fallthrough ] ]
2) attribut avec un espace de noms, tel que [ [ gnu :: unused ] ]
3) attribut standard avec arguments, tel que [ [ deprecated ( "reason" ) ] ]
4) attribut avec à la fois un espace de noms et une liste d'arguments, tel que [ [ gnu :: nonnull ( 1 ) ] ]

Explication

Les attributs fournissent la syntaxe standard unifiée pour les extensions de langage définies par l'implémentation, telles que les extensions de langage GNU et IBM __attribute__((...)) , l'extension Microsoft __declspec() , etc.

Un attribut peut être utilisé presque partout dans le programme C++, et peut s'appliquer à presque tout : aux types, aux variables, aux fonctions, aux noms, aux blocs de code, aux unités de traduction entières, bien que chaque attribut particulier ne soit valide que là où il est permis par l'implémentation : [[expect_true]] pourrait être un attribut qui ne peut être utilisé qu'avec une instruction if , et non avec une déclaration de classe. [[omp::parallel()]] pourrait être un attribut qui s'applique à un bloc de code ou à une boucle for , mais pas au type int , etc. (notez que ces deux attributs sont des exemples fictifs, voir ci-dessous pour les attributs standard et certains non standard)

Dans les déclarations, les attributs peuvent apparaître à la fois avant la déclaration entière et directement après le nom de l'entité qui est déclarée, auquel cas ils sont combinés. Dans la plupart des autres situations, les attributs s'appliquent à l'entité directement précédente.

Deux jetons consécutifs de crochet gauche ( [[ ) ne peuvent apparaître que lors de l'introduction d'un spécificateur d'attribut ou à l'intérieur d'un argument d'attribut.

En plus des attributs standard énumérés ci-dessous, les implémentations peuvent prendre en charge des attributs non standard arbitraires avec un comportement défini par l'implémentation. Tous les attributs inconnus d'une implémentation sont ignorés sans provoquer d'erreur.

Chaque standard-attribute est réservé à la standardisation. Autrement dit, chaque attribut non standard est préfixé par un attribute-prefix fourni par l'implémentation, par exemple [[gnu::may_alias]] et [[clang::no_sanitize]] .

Attributs standard

Seules les attributs suivants sont définis par la norme C. Chaque attribut standard dont le nom est de la forme attr peut également être écrit comme __attr__ et sa signification n'est pas modifiée.

[[ deprecated ]] (C23) [[ deprecated (" reason ")]] (C23)
indique que l'utilisation du nom ou de l'entité déclaré avec cet attribut est autorisée, mais déconseillée pour une raison
(spécificateur d'attribut)
(C23)
indique que la chute depuis l'étiquette de cas précédente est intentionnelle et ne devrait pas être diagnostiquée par un compilateur qui avertit sur les chutes
(spécificateur d'attribut)
[[ nodiscard ]] (C23) [[ nodiscard (" reason ")]] (C23)
encourage le compilateur à émettre un avertissement si la valeur de retour est ignorée
(spécificateur d'attribut)
(C23)
supprime les avertissements du compilateur sur les entités inutilisées, le cas échéant
(spécificateur d'attribut)
[[ noreturn ]] (C23) [[ _Noreturn ]] (C23) (obsolète)
indique que la fonction ne retourne pas
(spécificateur d'attribut)
(C23)
indique qu'une fonction est sans état, sans effet, idempotente et indépendante
(spécificateur d'attribut)
(C23)
indique qu'une fonction est sans effet et idempotente
(spécificateur d'attribut)

Test d'attributs

__has_c_attribute( jeton-attribut )

Vérifie la présence d'un jeton d'attribut nommé par attribute-token .

Pour les attributs standard, il se développera en l'année et le mois où l'attribut a été ajouté au brouillon de travail (voir le tableau ci-dessous), la présence d'attributs spécifiques au fournisseur est déterminée par une constante entière non nulle.

__has_c_attribute peut être développé dans l'expression de #if et #elif . Il est traité comme une macro définie par #ifdef , #ifndef et defined mais ne peut pas être utilisé ailleurs.

attribute-token Attribut Valeur Standard
deprecated [[ deprecated ]] 201904L (C23)
fallthrough [[ fallthrough ]] 201904L (C23)
maybe_unused [[ maybe_unused ]] 201904L (C23)
nodiscard [[ nodiscard ]] 202003L (C23)
noreturn
_Noreturn
[[ noreturn ]]
[[ _Noreturn ]]
202202L (C23)
unsequenced [[ unsequenced ]] 202207L (C23)
reproducible [[ reproducible ]] 202207L (C23)

Exemple

[[gnu::hot]] [[gnu::const]] [[nodiscard]]
int f(void); // déclarer f avec trois attributs
[[gnu::const, gnu::hot, nodiscard]]
int f(void); // identique à ci-dessus, mais utilise un seul spécificateur
             // d'attribut contenant trois attributs
int f(void) { return 0; }
int main(void)
{
}

Références

  • Norme C23 (ISO/IEC 9899:2024):
  • 6.7.12 Attributs (p: TBD)

Voir aussi

Documentation C++ pour Séquence de spécificateurs d'attributs

Liens externes

1. Attributs dans GCC
2. Attributs dans Clang