logo

Syntaxes __attribute__((constructeur)) et __attribute__((destructeur)) en C

Écrivez deux fonctions en C à l'aide du compilateur GCC, dont l'une s'exécute avant la fonction principale et l'autre après la fonction principale. Syntaxes spécifiques à GCC : 1. __attribute__((constructeur)) syntaxe : Cette syntaxe GCC particulière, lorsqu'elle est utilisée avec une fonction, exécute la même fonction au démarrage du programme, c'est-à-dire avant principal() fonction. 2. __attribute__((destructeur)) syntaxe : Cette syntaxe GCC particulière, lorsqu'elle est utilisée avec une fonction, exécute la même fonction juste avant que le programme ne se termine via _exit, c'est-à-dire après principal() fonction. Explication : La façon dont fonctionnent les constructeurs et les destructeurs est que le fichier objet partagé contient des sections spéciales (.ctors et .dtors sur ELF) qui contiennent des références aux fonctions marquées respectivement par les attributs constructeur et destructeur. Lorsque la bibliothèque est chargée/déchargée, le programme de chargement dynamique vérifie si de telles sections existent et si c'est le cas appelle les fonctions qui y sont référencées. Quelques points à ce sujet méritent d'être notés : 1. __attribute__((constructeur)) s'exécute lorsqu'une bibliothèque partagée est chargée, généralement au démarrage du programme. 2. __attribute__((destructeur)) s'exécute lorsque la bibliothèque partagée est déchargée, généralement à la sortie du programme. 3. Les deux parenthèses servent probablement à les distinguer des appels de fonction. 4. __attribut__ est une syntaxe spécifique à GCC ; pas une fonction ou une macro. Code du conducteur : CPP
// C program to demonstrate working of // __attribute__((constructor)) and // __attribute__((destructor)) #include // Assigning functions to be executed before and // after main() void __attribute__((constructor)) calledFirst(); void __attribute__((destructor)) calledLast(); void main() {  printf('nI am in main'); } // This function is assigned to execute before // main using __attribute__((constructor)) void calledFirst() {  printf('nI am called first'); } // This function is assigned to execute after // main using __attribute__((destructor)) void calledLast() {  printf('nI am called last'); } 
Output:
I am called first I am in main I am called last 
Créer un quiz