今天和同事討論babeltrace的時候,一直找不到新format庫的入口,後來仔細查找了一下已有的格式轉換ctf-text的註冊函數定義:void __attribute__((constructor)) ctf_text_init(void),發現了這個有趣的使用方法: __attribute__((constructor))這個東東相似於C++的構造函數,在main()前被調用. 相似的還有__attribute__((destructor))。 下面是一個網上搜索到的一個測試例子:ios
__attribute__((constructor))
__attribute__((destructor))babel
$ gcc test.c -o test
$ ./test
before main
in main
after main函數
根據上面的代碼以及輸出結果,咱們能夠猜到__attribute__((constructor))表示這段代碼將在main函數前調用,就像在C++裏面的全局變量類的構造同樣.測試
說到C++裏面的全局類對象的構造,咱們不由要問全局類對象的構造跟__attribute__((constructor))以及destructor誰在前誰在後呢?spa
$ make test2orm
$ ./test2對象
AAA construct
Before Main
in main
AAA destructor
After Mainit
能夠看到全局類的構造過程發生在before_main()函數前面,而析構也發生在after_main()前面.io