[C / C ++] El programa ejecuta código antes / después de main | imprime la fecha de compilación antes de main

Tabla de contenido

El programa ejecuta código antes / después de main

Imprimir fecha de compilación


El programa ejecuta código antes / después de main

http://www.mamicode.com/info-detail-2087871.html

  Antes de la función principal, habrá una serie de operaciones de inicialización, dichas operaciones suelen ser completadas por el enlazador y así sucesivamente.

Específicamente, la primera función ejecutada por el programa no es main. Por ejemplo, en Windows, esta función es mainCRTStartup. Esta función la ejecuta el vinculador para inicializar la biblioteca en tiempo de ejecución. Esta función llamará a la función CRTInit, lo que afectará a C Global Se inicializan las variables, la asignación de memoria C y los objetos y constructores de clase global en C ++. Entonces es posible ejecutar parte de su propio código antes de la función principal.

1. Utilice la palabra clave __attribute de gcc en Linux

       En la programación C en el entorno Linux, puede utilizar la palabra clave __attribute para definir constructor y destructor . El primero se ejecutará antes de la función principal y el segundo se ejecutará después de la función principal .

       el código se muestra a continuación:

 #include <stdio.h>
 
__attribute((constructor)) void before_main()
 {
     printf("before main!\n");
 }
 
  __attribute((destructor)) void after_main()
  {
     printf("after main!\n");
 }
 
 int main(void)
 {
     printf("This is main function.\n");
     return 0;
 }

before_main.c

       resultado de la operación:

natalie@ubuntu:~/Desktop/zhou_it_c/before_main$ gcc before_main.c -o before_main

natalie@ubuntu:~/Desktop/zhou_it_c/before_main$ ./before_main
before main!
This is main function.
after main!

2. Utilice #pragma predefinido en el entorno de Windows

       Mencionamos anteriormente que se realizará un trabajo de inicialización en la función CRTInit, incluida la biblioteca C, la función de inicialización C, la biblioteca C ++, la función de inicialización C ++, etc. C y C ++ tienen cada uno una tabla para almacenar los punteros de la función de inicialización, y cada tabla usa 2 punteros para aclarar el alcance. En el proceso de inicialización, la función __CRTInit llamará a las funciones en estas dos tablas a la vez, por lo que si podemos poner la función a ejecutar en estas dos tablas, entonces podemos lograr el propósito de ejecutar el código antes que main.

       El alcance de la tabla de funciones de inicialización de C es: [__xi_a, __xi_a] El alcance de la tabla de funciones de inicialización de C ++ es: [__xc_a, __xc_z]

       Cuando ejecutamos específicamente, colocamos la función a ejecutar en la sección definiendo nombres de sección especiales ".CRT $ XIU" y ".CRT $ XCU". El enlazador formará una tabla de funciones de inicialización de C:

       [__xi_a, ..., before1 (xiu), ..., __xi_z]

       Y tabla de funciones de inicialización de C ++:

       [__xc_a, ..., before2 (xcu), ..., __xc_z]

       el código se muestra a continuación:

#include <stdio.h>

int before_main(void)
{
    printf("before main!\n");
    return 0;
}

typedef int func();

#pragma data_seg(".CRT$XIU")
static func *before[] = { before_main };
#pragma data_seg()


int main(void)
{
    printf("This is main function.\n");
    return 0;
}

 

before_main.c

3. Úselo para definir objetos de clase global o variables globales en la programación C ++

       mainCRTStartup inicializa el objeto global a, lo que significa que el constructor de a se ejecutará antes que main , por lo que solo necesitamos definir la función que queremos ejecutar en el constructor de a .

       Otra forma es definir una variable global como la estructura después de que se ejecute la función, luego la función se usará para la inicialización y se ejecutará antes que main.

       el código se muestra a continuación:

 #include <iostream>
 using namespace std;
 using std::cout;
 
 int func()
  {
      cout <<"before main: func()" << endl;
      return 0;
  }
 
 class A
 {
 public:
     A()
     {
         cout << "A() constructor" << endl;
     }
     ~A()
     {
         cout << "A() destructor" << endl;
     }
 };
 
 A a;
 
 int g_iValue = func();
 
 int main(void)
 {
     cout << "This is main function." << endl;
     return 0;
 }

before_main.cpp

       resultado de la operación:

A() constructor
before main: func()
This is main function.
A() destructor

 

Imprimir fecha de compilación

https://blog.csdn.net/bandaoyu/article/details/114704021

Supongo que te gusta

Origin blog.csdn.net/bandaoyu/article/details/114760738
Recomendado
Clasificación