Ejecutando código antes de main ()

En lenguajes orientados a objetos (C ++), puede ejecutar código antes de main() utilizando un objeto global o un objeto estático de clase y hacer que sus constructores ejecuten el código que desea.

¿Hay alguna manera de hacer esto en C? No tengo ningún problema específico que esté tratando de resolver, solo tengo curiosidad. Una cosa para la que podría ser útil es inicializar automáticamente una biblioteca.

Hay maneras de usar __attribute__ pero esas son muy específicas de su comstackdor y el código que se escribe usando estas no es realmente portátil. Por otro lado, el lenguaje C no proporciona ningún módulo / biblioteca de inicio.

En C, lógicamente main() es la primera función llamada por el sistema operativo. Pero antes de llamar a main() , el sistema operativo llama a otra función llamada módulo de start-up para configurar diversas variables de entorno, inicializar variables estáticas (no inicializadas), crear un marco de stack (registro de activación) e inicializar el puntero de stack al inicio del área de la stack y otras tareas que deben realizarse antes de llamar a main() .

Diga que si está escribiendo código para sistemas embebidos donde no hay un sistema operativo mínimo o mínimo para realizar el trabajo mencionado anteriormente, debe explorar estas opciones que dependen del comstackdor. Además de los comstackdores GCC, Turbo-C y Microsoft C, se proporcionan facilidades para agregar código en una máquina de hardware particular (máquinas fe 8086).

IOW, los módulos de inicio no están destinados a los progtwigdores.

Puedes hacerlo con __attribute__ ((constructor)) . He probado el siguiente ejemplo con gcc y clang . Dicho esto, no es parte del lenguaje.

 #include  void __attribute__ ((constructor)) premain() { printf("premain()\n"); } int main(int argc, char *argv[]) { printf("main()\n"); return 0; } 

Hace lo siguiente:

 $ ./test premain() main() 

Con gcc, puede hacerlo utilizando el atributo de la función constructora, por ejemplo,

 __attribute__ ((__constructor__)) void foo(void) { ... } 

Esto invocará foo antes de main.

Nota: Esto probablemente no sea portátil para otros comstackdores.

Puede inicializar variables globales pero no llamar a funciones dentro de estas inicializaciones.

No de una manera que cumpla con los estándares, ¡pero debería profundizar en lo que realmente sucede cuando su sistema operativo carga la imagen binaria y llama a la función principal de la aplicación!

Hay formas portátiles de especificar funciones que pueden ejecutarse “después de que se ejecuta main”.

  1. atexit()

  2. at_quick_exit()

Además, siga este enlace y sobre varios tipos de inicialización en C ++, que pueden ser útiles para ejecutar el código antes de llamar a main ().