Précisions sur les variables, attributs
Précisions sur les variables
1. Visibilité et durée de vie d’une variable
L’écriture des fonctions renvoie à la visibilité et la durée de vie des variables dans un programme. Les règles sont les mêmes en C et C++.
Une variable est visible dans le bloc dans lequel elle est déclarée et dans tous ses sous-blocs. Elle n’est pas accessible dans les blocs au-dessus ni dans d’autres blocs séparés, y compris ceux des fonctions. Sa durée de vie est celle du bloc dans lequel elle est déclarée.
Si la variable est déclarée hors bloc, c’est-à-dire au niveau 0 du fichier, elle est visible dans tout le fichier à partir de sa déclaration. C’est ce qui est appelé une variable globale.
Expérimentation :
#include <iostream>
int G = 0; // visible dans tout le fichier
int main()
{
int a = 5;
//sous-bloc
if(rand()%2) {
a++; // visible
int b = 10;
//sous-sous-bloc
if(rand()%2) {
int c = 20;
a++; // visible
b++; // visible
} // fin c
//sous-sous-bloc...
Attributs
Depuis C++11, le C++ propose la spécification d’attributs et de séquences d’attributs.
1. Principe et syntaxe
Les attributs interviennent à la compilation. Ils indiquent dans un programme des caractéristiques, des options ou des critères particuliers qui interviennent à la déclaration d’un type, d’un objet ou dans une séquence de code. Chaque attribut est identifié par un nom défini selon l’implémentation.
La syntaxe décline plusieurs possibilités :
1) attribut unique :
[[ attribut ]]
Exemple
[[noreturn]]
2) liste d’attributs, ils sont séparés par une virgule :
[[ attrib1, attrib2, attrib3 ]]
3) des arguments peuvent être ajoutés à un attribut
[[ attrib1, attrib2(liste arguments) ]]
Exemple
[[deprecated("because")]]
4) Un attribut peut être situé dans un namespace :
[[ namespace:: attrib(liste arguments) ]]
Exemple
[[CC::opt(1), CC::debug]]
Un using est utilisable lorsque plusieurs attributs sont dans le même namespace :
[[ using namespace : liste attributs ]]
Exemple
[[using CC: opt(1), debug]]
La plupart des attributs sont affiliés à un environnement spécifique et relèvent de sa documentation particulière.
2. Exemples d’utilisation
a. Expérimentation GNU
La documentation http://cppreference.com se réfère à l’environnement GNU et donne l’exemple suivant :
[[gnu::always_inline]] [[gnu::hot]] [[gnu::const]] [[nodiscard]]
inline int f(); // declare f avec quatre attributs
[[gnu::always_inline, gnu::const, gnu::hot, nodiscard]]
int f(); // idem mais en réunissant les quatre attributs
// C++17 permet le using
[[using gnu : const, always_inline, hot]] [[nodiscard]]
...