Attribute specifier sequence (since C23)
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) | ||||||||
où 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) | ||||||||
où 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 ).
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) |
[[
fallthrough
]]
(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) |
|
encourage le compilateur à émettre un avertissement si la valeur de retour est ignorée
(spécificateur d'attribut) |
|
[[
maybe_unused
]]
(C23)
|
supprime les avertissements du compilateur sur les entités inutilisées, le cas échéant
(spécificateur d'attribut) |
|
indique que la fonction ne retourne pas
(spécificateur d'attribut) |
|
[[
unsequenced
]]
(C23)
|
indique qu'une fonction est sans état, sans effet, idempotente et indépendante
(spécificateur d'attribut) |
[[
reproducible
]]
(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 |