Sintaxis de __attribute__((constructor)) y __attribute__((destructor)) en C

Escriba dos funciones en C usando el compilador GCC, una de las cuales se ejecuta antes de la función principal y la otra se ejecuta después de la función principal.

Sintaxis específicas de GCC :

1. Sintaxis __attribute__((constructor)) : Esta sintaxis GCC particular, cuando se usa con una función, ejecuta la misma función al inicio del programa, es decir, antes de la función main() .

2. Sintaxis __attribute__((destructor)) : Esta sintaxis GCC en particular, cuando se usa con una función, ejecuta la misma función justo antes de que el programa termine a través de _exit, es decir, después de la función main() .

Explicación :
la forma en que funcionan los constructores y destructores es que el archivo de objeto compartido contiene secciones especiales (.ctors y .dtors en ELF) que contienen referencias a las funciones marcadas con los atributos constructor y destructor, respectivamente. Cuando se carga/descarga la biblioteca, el programa cargador dinámico comprueba si existen dichas secciones y, en caso afirmativo, llama a las funciones a las que se hace referencia en ellas.

Vale la pena señalar algunos puntos con respecto a estos:
1. __attribute__((constructor)) se ejecuta cuando se carga una biblioteca compartida, generalmente durante el inicio del programa.
2. __attribute__((destructor)) se ejecuta cuando se descarga la biblioteca compartida, normalmente al salir del programa.
3. Presumiblemente, los dos paréntesis son para distinguirlos de las llamadas a funciones.
4. __attribute__ es una sintaxis específica de GCC, no una función ni una macro.

Código del conductor :

// C program to demonstrate working of
// __attribute__((constructor)) and
// __attribute__((destructor))
#include<stdio.h>
  
// 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");
}

Producción:

I am called first
I am in main
I am called last

Este artículo es una contribución de Rishav Raj . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *