如何在main函式前後執行程式碼

滕瑞發表於2015-03-18

第一次遇到這個問題的時候,第一反應是我沒聽錯吧,然後默默在心裡把面試官罵了N遍。

對於C++來說,全域性變數、靜態變數的初始化是在main函式前執行的,這樣就可以在建構函式裡面執行一些東西。另外,今天再介紹幾個底層玩法。

直接上程式碼(以C語言為例,儲存為demo.c):

#include <stdio.h>

__attribute__((constructor)) int demo_constructor()
{
    printf("Oops!\n");
    return 0;
}

int demo_init()
{
    __asm__ (".section .init \n call demo_init \n .section .text\n");
    printf("run in .init section\n");
    return 0;
}

int demo_fini()
{
    __asm__(".section .fini \n call demo_fini \n .section .text\n");
    printf("run in .fini section\n");
    return 0;
}

__attribute__((destructor)) int demo_destructor()
{
    printf("Bye!\n");
    return 0;
}

int main()
{
    printf("Hello World!\n");
    return 0;
}

執行結果為:

enter image description here

結論:

  1. __attribute__((constructor))擴充套件關鍵字可以宣告在main函式之前執行的函式,destructor則對應main函式結束之後執行的函式。
  2. __asm__可以定義.init或者.fini程式碼段的函式。
  3. 這些函式都是在main函式之外執行的,init程式碼段先於constructor,而fini晚於destructor。
  4. 以上方法適用於GCC,Windows環境中應該有其他對應的方法。

相關文章