[C / C ++] Le programme exécute le code avant / après main | imprime la date de compilation avant main

table des matières

Le programme exécute le code avant / après main

Imprimer la date de compilation


Le programme exécute le code avant / après main

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

  Avant la fonction principale, il y aura une série d'opérations d'initialisation, ces opérations sont généralement effectuées par l'éditeur de liens et ainsi de suite.

Plus précisément, la fonction la plus ancienne exécutée par le programme n'est pas principale. Par exemple, dans Windows, cette fonction est mainCRTStartup. Cette fonction est exécutée par l'éditeur de liens pour initialiser la bibliothèque d'exécution. Cette fonction appellera la fonction CRTInit, ce qui affectera C Global les variables, l'allocation de mémoire C et les objets de classe globale et les constructeurs en C ++ sont initialisés. Il est donc possible d'exécuter une partie de votre propre code avant la fonction principale.

1. Utilisez le mot-clé __attribute de gcc sous Linux

       En programmation C dans l'environnement Linux, vous pouvez utiliser le mot clé __attribute pour définir le constructeur et le destructeur . Le premier sera exécuté avant la fonction main , et le second sera exécuté après la fonction main .

       code montrer comme ci-dessous:

 #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

       résultat de l'opération:

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. Utilisez #pragma prédéfini dans l'environnement Windows

       Nous avons mentionné ci-dessus que certains travaux d'initialisation seront effectués dans la fonction CRTInit, notamment la bibliothèque C, la fonction d'initialisation C, la bibliothèque C ++, la fonction d'initialisation C ++, etc. C et C ++ ont chacun une table pour stocker les pointeurs de fonction d'initialisation, et chaque table utilise 2 pointeurs pour clarifier la portée. Dans le processus d'initialisation, la fonction __CRTInit appellera les fonctions de ces deux tables à la fois, donc si nous pouvons placer la fonction à exécuter dans ces deux tables, alors nous pouvons atteindre l'objectif d'exécuter le code avant main.

       La portée de la table des fonctions d'initialisation C est: [__xi_a, __xi_a] La portée de la table des fonctions d'initialisation C ++ est: [__xc_a, __xc_z]

       Lorsque nous exécutons spécifiquement, nous mettons la fonction à exécuter dans la section en définissant des noms de section spéciaux ".CRT $ XIU" et ".CRT $ XCU". L'éditeur de liens formera un tableau des fonctions d'initialisation C:

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

       Et table des fonctions d'initialisation C ++:

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

       code montrer comme ci-dessous:

#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. Utilisez pour définir des objets de classe globale ou des variables globales dans la programmation C ++

       mainCRTStartup initialise l'objet global a, ce qui signifie que le constructeur de a sera exécuté avant main , il suffit donc de définir la fonction que nous voulons exécuter dans le constructeur de a .

       Une autre façon est de définir une variable globale comme structure après l'exécution de la fonction, puis la fonction sera utilisée pour l'initialisation et sera exécutée avant main.

       code montrer comme ci-dessous:

 #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

       résultat de l'opération:

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

 

Imprimer la date de compilation

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

Je suppose que tu aimes

Origine blog.csdn.net/bandaoyu/article/details/114760738
conseillé
Classement