__attribute__((constructor))
是GCC和兼容的編譯器中的一個特性,用于指示編譯器將一個函數標記為在程序啟動時自動執行的初始化函數。
同樣的還有__attribute__((destructor))在main()函數后調用。
當你在一個函數聲明或定義前加上__attribute__((constructor))
屬性時,就會告訴編譯器,在程序加載時(在main函數執行之前),需要自動調用這個函數。這個特性通常用于在程序啟動時執行一些全局的初始化工作,比如注冊回調函數、初始化全局變量等。
舉個例子,如果你有一個函數 void my_init_function(void)
,并且你想在程序啟動時自動執行它,你可以這樣聲明:
void my_init_function(void) __attribute__((constructor));
然后在程序加載時,my_init_function
將會被自動調用。
總的來說,__attribute__((constructor))
特性為開發者提供了一種方便的方式來定義在程序啟動時自動執行的初始化函數,使得全局的初始化工作變得更加簡單和方便。
__attribute__((constructor))
還可以指定優先級。
在GCC和Clang中,初始化函數的優先級是越小越先執行,而不是越大越先執行。這意味著具有較小優先級值的初始化函數會在具有較大優先級值的初始化函數之前執行。
默認情況下,沒有指定優先級的初始化函數被視為具有中等優先級(0),而通過顯式設置優先級,可以控制初始化函數的執行順序。
舉個例子,如果你有三個初始化函數a()
、b()
和c()
,并且你希望按照a()
-c()
-b()
的順序執行,你可以這樣定義:
void a() __attribute__((constructor(99)));
void b() __attribute__((constructor(101)));
void c() __attribute__((constructor(100)));
在這個例子中,a()
函數的優先級為101,c()
的優先級為100,b()
的優先級為99。因此,在程序啟動時,它們將按照a()
-c()
-b()
的順序執行。
需要注意的是,初始化函數的優先級僅用于確定它們的執行順序,并不表示初始化的速度。初始化函數的執行速度取決于函數本身的實現和所涉及的操作,與優先級無關。
請記住,全局變量的初始化順序是依賴于編譯器和鏈接器的具體實現的,可能在不同的編譯器和平臺上有所不同。因此,在編寫代碼時,應盡量避免過于依賴全局變量之間的初始化順序,以確保代碼的可移植性和穩定性。
#include <stdio.h>
#include <stdlib.h>static void before(void) __attribute__((constructor));static void before3(void) __attribute__((constructor(103)));
static void before2(void) __attribute__((constructor(102)));
static void before1(void) __attribute__((constructor(101)));static void before2() { printf("before 102\n"); }static void before1() { printf("before 101\n"); }static void before3() { printf("before 103\n"); }static void before() { printf("before main\n"); }int main() {printf("main\n");return 0;
}
運行結果:
$ ./a.out
before 101
before 102
before 103
before main
main