Buenas a todos! Tengo algo bastante interesante para aquellos que quieran probarlo. Como vieron en nuestras presentaciones utilizabamos la directiva "
" sobre una estructura para que el compilador se encargara de compactarla. El tema es que en GCC existen muchas mas directiva de __attribute__ las cuales pueden resultarles útiles.
En esta ocasión les traigo __attribute__((constructor)) & __attribute__((destructor)):
The constructor attribute causes the function to be called automatically before execution enters main (). Similarly, the destructor attribute causes the function to be called automatically after main () has completed or exit () has been called. Functions with these attributes are useful for initializing data that will be used implicitly during the execution of the program.
You may provide an optional integer priority to control the order in which constructor and destructor functions are run. A constructor with a smaller priority number runs before a constructor with a larger priority number; the opposite relationship holds for destructors. So, if you have a constructor that allocates a resource and a destructor that deallocates the same resource, both functions typically have the same priority. The priorities for constructor and destructor functions are the same as those specified for namespace-scope C++ objects (see C++ Attributes).
Lo que a grandes rasgos quiere decir, es que si nosotros colocamos en la declaración de un método __attribute__((constructor)) este es llamado antes de que se ejecute el main, Ej:
static FILE *fp_trace;
void __attribute__ ((constructor)) trace_begin (void) {
fp_trace = fopen("trace.out", "w");
}
void __attribute__ ((destructor)) trace_end (void){
if(fp_trace != NULL) {
fclose(fp_trace);
}
}
En este caso, estamos abriendo un archivo para logear antes de que se ejecute el main, y luego declaramos la forma de cerrarla al terminar de ejecutar el main. En este caso la implementacion es muy vaga y poco practica, ya que las funcionalidades son limitadas y el encapsulamiento es mínimo, plantear un TAD con mas abstracción y mas funcionalidad seria lo optimo.
Un caso mas practico para esto seria por ejemplo la inicializacion de signals con sus correspondientes handlers. En un modelo mas complejo podríamos llegar a definir un TAD que se encargue de gestionar un pool de threads al inicio del proceso.
From:
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html