Me gustaría hacer algunas cosas antes de la función main
. Tengo varios archivos fuente. En cada archivo, hay algo de trabajo que debe hacerse antes de main
. No fue un problema en C++, pero problemático con C.Llamar algunas funciones antes de principal en C
En C++, esto se puede hacer de dos maneras:
- La explotación de un constructor de una clase/estructura global.
- Llamar a una función de una variable global
Por ejemplo, static const int __register_dummy_ = __AddRegisterMetaInfo(...);
Sin embargo, en C, ya sea maneras es imposible. Obviamente, no hay constructor. Entonces, la primera opción es intrínsecamente imposible.
Pensé que la segunda opción sería posible, pero no compilada en C (Probé solo con Visual C++. Da C2099). C solo permite una constante a una variable no automática.
¿Hay alguna manera de llamar a algunas funciones antes de main?
EDITAR: Parece que mucha gente acaba de conseguir mal lo que realmente quería hacer. Perdón por escribir esta pregunta de una manera simplificada.
Lo que necesitaba hacer era implementar una especie de característica de información de clase de tiempo de ejecución de C++, al igual que MFC's approach. En este enfoque, necesito obtener información de todos los códigos fuente. Por ejemplo, supongamos que cada archivo fuente tiene una definición de clase y me gustaría ver toda la información (por ejemplo, los nombres de clase y la clase principal). La forma más fácil es colocar un constructor estático en cada archivo, y cada constructor accede a una estructura de datos global y registra su información. Pero también quería encontrar una forma de implementar algo similar en C. Así que, simplemente llamar a pre_main_job
en main
no puede ser una respuesta para mí.
Tenga en cuenta que este abuso de constructor estático también se puede encontrar en el conjunto de compiladores LLVM. Cada función de optimización/análisis se implementa como un pase. Todos estos pases se registran a través de un constructor estático.
¿Alguna de esas funciones se llama 'I_will_explode_if_you_call_me_from_main'? –
Por curiosidad, ¿por qué querrías hacer esto? –
Una solución posible (o solución, según su perspectiva) es usar su compilador C++ como un mejor compilador de C; luego puede seleccionar características como inicializadores estáticos. –