C++ Attributi

Da Andreabont's Wiki.

In C++ un attributo è un tag applicabile alla dichiarazione di funzioni o variabili che ha effetti a compile-time. Un attributo può essere definito a livello di standard C++ oppure dal compilatore usato.

Namespace

Possono esistere dei namespace a livello di attributi, questi servono a definire gli attributi utilizzati solo da alcuni compilatori, e vengono ignorati dai compilatori che non li supportano. E' anche possibile accorpare più attributi che fanno parte dello stesso namespace, ad esempio:

[[gnu::always_inline]] [[gnu::hot]] [[gnu::const]]

Può diventare:

[[using gnu : const, always_inline, hot]]

Attributi standard

Deprecated

Questo attributo serve a indicare che la funzione è deprecata e non andrebbe usata (anche se è ancora possibile farlo). Se si usa una funzione con questo attributo durante la compilazione verranno visualizzati dei messaggi di avviso.

[[deprecated]]
void funzione_deprecata() {
        std::cout << "Funzione" << std::endl;
}

E' possibile personalizzare il messaggio visualizzato durante la compilazione:

[[deprecated("Funzione deprecata!")]]
void funzione_deprecata() {
        std::cout << "Funzione" << std::endl;
}

Nodiscard

Questo attributo serve a specificare che il valore di ritorno di una funzione non può essere ignorato.

[[nodiscard]]
int la_risposta() {
        return 42;
}

Maybe unused

Questo attributo sopprime i warning sul mancato utilizzo di porzioni di codice.

[[maybe_unused]]
int funzione_strana() {
        [[maybe_unused]] int a = 10;
}

Attributi GNU

Questi attributi sono supportati solo da GCC e Clang. Per maggiori informazioni consultare:

Warning

Questo attributo solleva un warning a compile-time.

[[gnu::warning("ATTENZIONE!")]]
int funzione_pericolosa() {
        std::cout << "Funzione" << std::endl;
}

Error

Questo attributo solleva un error a compile-time.

[[gnu::error("ERRORE!")]]
int funzione_sbagliata() {
        std::cout << "Funzione" << std::endl;
}

Always inline

Questo attributo forza il compilatore ad inserire sempre inline la funzione, dove viene chiamata.

[[gnu::always_inline]]
int funzione_inline() {
        std::cout << "Funzione" << std::endl;
}

Constructor

Questo attributo indica al compilatore di chiamare questa funzione prima di entrare nel MAIN.
Attenzione! In questo momento alcuni oggetti della libreria standard potrebbero non essere ancora disponibili.

[[gnu::constructor]]
void constructor() {
        // Codice
}

Destructor

Questo attributo indica al compilatore di chiamare questa funzione una volta usciti dal MAIN.

[[gnu::destructor]]
void destructor() {
        // Codice
}