Attributspezifizierer-Sequenz(seit C23)
Führt implementierungsdefinierte Attribute für Typen, Objekte, Ausdrücke usw. ein.
Inhalt |
[bearbeiten] Syntax
[[attr ]][[attr1, attr2, attr3(args)]][[attribut-präfix::attr (args)]]
Formal ist die Syntax:
[[ attributliste ]] |
(seit C23) | ||||||||
wobei attributliste eine durch Kommas getrennte Sequenz von null oder mehr attribut-token ist
| standard-attribut | (1) | ||||||||
attribut-präfix :: bezeichner |
(2) | ||||||||
standard-attribut ( argumentliste (optional) ) |
(3) | ||||||||
attribut-präfix :: bezeichner ( argumentliste (optional) ) |
(4) | ||||||||
wobei attribut-präfix ein bezeichner und argumentliste eine Sequenz von Token ist, bei der Klammern, eckige Klammern und geschweifte Klammern ausgeglichen sind (ausgeglichene-token-sequenz).
[bearbeiten] Erklärung
Attribute bieten die einheitliche Standard-Syntax für implementierungsdefinierte Spracherweiterungen, wie z. B. die GNU- und IBM-Spracherweiterungen __attribute__((...)), die Microsoft-Erweiterung __declspec() usw.
Ein Attribut kann fast überall im C-Programm verwendet werden und auf fast alles angewendet werden: auf Typen, auf Variablen, auf Funktionen, auf Namen, auf Codeblöcke, auf ganze Übersetzungseinheiten, obwohl jedes bestimmte Attribut nur dort gültig ist, wo es von der Implementierung zugelassen wird: [[expect_true]] könnte ein Attribut sein, das nur mit einer if-Anweisung und nicht mit einer Klassendeklaration verwendet werden kann. [[omp::parallel()]] könnte ein Attribut sein, das für einen Codeblock oder eine for-Schleife gilt, aber nicht für den Typ int usw. (beachten Sie, dass diese beiden Attribute fiktive Beispiele sind, siehe unten für die Standard- und einige Nicht-Standardattribute).
In Deklarationen können Attribute sowohl vor der gesamten Deklaration als auch direkt nach dem Namen der deklarierten Entität erscheinen, in welchem Fall sie kombiniert werden. In den meisten anderen Situationen gelten Attribute für die direkt vorangehende Entität.
Zwei aufeinanderfolgende linke eckige Klammern ([[) dürfen nur beim Einführen eines Attributspezifizierers oder innerhalb eines Attributarguments erscheinen.
Neben den unten aufgeführten Standardattributen können Implementierungen beliebige nicht standardisierte Attribute mit implementierungsdefinierter Semantik unterstützen. Alle einer Implementierung unbekannten Attribute werden ignoriert, ohne einen Fehler zu verursachen.
Jedes standard-attribut ist für die Standardisierung reserviert. Das heißt, jedes nicht standardisierte Attribut wird mit einem von der Implementierung bereitgestellten attribut-präfix versehen, z. B. [[gnu::may_alias]] und [[clang::no_sanitize]].
[bearbeiten] Standardattribute
Nur die folgenden Attribute sind durch den C-Standard definiert. Jedes Standardattribut, dessen Name die Form attr hat, kann auch als __attr__ geschrieben werden, und seine Bedeutung ändert sich nicht.
[[deprecated]](C23)[[deprecated("reason")]](C23){{{notes}}} |
zeigt an, dass die Verwendung des Namens oder der Entität, die mit diesem Attribut deklariert wurde, erlaubt, aber aus einem bestimmten Grund nicht empfohlen wird. (Attributspezifizierer) |
[[fallthrough]](C23) |
zeigt an, dass der Fall-Through vom vorherigen Case-Label beabsichtigt ist und von einem Compiler, der Fall-Through warnt, nicht diagnostiziert werden sollte (Attributspezifizierer) |
| ermutigt den Compiler, eine Warnung auszugeben, wenn der Rückgabewert verworfen wird. (Attributspezifizierer) | |
[[maybe_unused]](C23) |
unterdrückt Compiler-Warnungen für nicht verwendete Entitäten, falls vorhanden. (Attributspezifizierer) |
| zeigt an, dass die Funktion nicht zurückkehrt (Attributspezifizierer) | |
[[unsequenced]](C23) |
zeigt an, dass eine Funktion zustandslos, effektschwach, idempotent und unabhängig ist. (Attributspezifizierer) |
[[reproducible]](C23) |
zeigt an, dass eine Funktion effektschwach und idempotent ist. (Attributspezifizierer) |
[bearbeiten] Attributprüfung
__has_c_attribute( attribut-token ) |
|||||||||
Prüft auf die Anwesenheit eines Attribut-Tokens mit dem Namen von attribut-token.
Für Standardattribute wird es auf das Jahr und den Monat expandiert, in dem das Attribut zum Arbeitsentwurf hinzugefügt wurde (siehe Tabelle unten). Die Anwesenheit von herstellerspezifischen Attributen wird durch eine von Null verschiedene ganzzahlige Konstante bestimmt.
__has_c_attribute kann im Ausdruck von #if und #elif expandiert werden. Es wird als definiertes Makro von #ifdef, #ifndef und defined behandelt, kann aber nirgendwo sonst verwendet werden.
| attribut-token | Attribut | Wert | 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) |
[bearbeiten] Beispiel
[[gnu::hot]] [[gnu::const]] [[nodiscard]] int f(void); // declare f with three attributes [[gnu::const, gnu::hot, nodiscard]] int f(void); // the same as above, but uses a single attr // specifier that contains three attributes int f(void) { return 0; } int main(void) { }
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 6.7.12 Attribute (S. TBD)
[bearbeiten] Siehe auch
| C++-Dokumentation für Attributspezifizierer-Sequenz
|
[bearbeiten] Externe Links
| 1. | Attribute in GCC |
| 2. | Attribute in Clang |