Ceci est une ancienne révision du document !
Les attributs ci-dessous sont non standards et dépendent du compilateur.
__attribute__((const)) et __attribute__((pure))
Les fonctions pure
et const
ne modifient aucune donnée à l'extérieure de la fonction. La différence est que deux appels consécutifs à une fonction pure
ne renverront pas toujours le même résultat contrairement à une fonction const
où les résultats seront toujours les mêmes.
pure
a accès aux arguments et aux variables globales et peut déréférencer un pointeur dont le contenu peut changer entre deux appels.
const
n'a accès qu'aux arguments et ne peut pas déréférencer un pointeur.
The const attribute imposes greater restrictions on a function’s definition than the similar pure attribute.
The const attribute prohibits a function from reading objects that affect its return value between successive invocations.
In general, since a function cannot distinguish data that might change from data that cannot, const functions should never take pointer or, in C++, reference arguments.
Using the GNU Compiler Collection, Archive v9.2 le 06/03/2020
__attribute__((weak))
Cette information va être utile au lieur.
Chaque symbole (variable globale ou fonction) peut être “strong” ou weak
. Si un symbole “strong” existe, les symboles weak
seront ignorés. Si deux symboles weak
existent sans symbole “strong”, le lieur prendra aléatoirement l'un des deux. Si deux symboles “strong” existent, le lieur va générer une erreur duplicate symbol
.
Il est aussi possible de définir un prototype ou la déclaration d'une variable globale extern
en weak
. Dans ce cas, si le symbole n'est pas défini, le lieur ne posera pas de problème (pas de undefined reference to
) et considérera que le symbole est à l'adresse null
(attention aux pointeurs null).
#include <iostream> // Défini dans le header extern int __attribute__((weak)) variable; extern unsigned char __attribute__((weak)) variableNull; // Défini dans le code source. int __attribute__((weak)) variable = 1; int main() { // variable a bien un pointeur non nullptr. std::cout << reinterpret_cast<size_t>(&variable) << " vaut " << variable << "\n"; // variableNull est bien une variable avec un pointeur nullptr. std::cout << reinterpret_cast<size_t>(&variableNull) << " est nullptr.\n"; }
Résultat dans la sortie standard:
6295640 vaut 1 0 est nullptr.