__attribute__

今天和同事討論babeltrace的時候,一直找不到新format庫的入口,後來仔細查找了一下已有的格式轉換ctf-text的註冊函數定義:void __attribute__((constructor)) ctf_text_init(void),發現了這個有趣的使用方法: __attribute__((constructor))這個東東相似於C++的構造函數,在main()前被調用. 相似的還有__attribute__((destructor))。 下面是一個網上搜索到的一個測試例子:ios

__attribute__((constructor))
__attribute__((destructor))babel

  1.   
  2.   
  3. #include<stdio.h>  
  4. __attribute__((constructor)) void before_main()  
  5. {  
  6.    printf("before main\n");  
  7. }  
  8.   
  9. __attribute__((destructor)) void after_main()  
  10. {  
  11.    printf("after main\n");  
  12. }  
  13.   
  14. int main()  
  15. {  
  16.    printf("in main\n");  
  17.    return 0;  
  18. }  

$ gcc test.c -o test
$ ./test
before main
in main
after main函數

根據上面的代碼以及輸出結果,咱們能夠猜到__attribute__((constructor))表示這段代碼將在main函數前調用,就像在C++裏面的全局變量類的構造同樣.測試

說到C++裏面的全局類對象的構造,咱們不由要問全局類對象的構造跟__attribute__((constructor))以及destructor誰在前誰在後呢?spa

 

  1. #include<iostream>  
  2. using namespace std;  
  3. __attribute__((constructor)) void before_main()  
  4. {  
  5.     cout<<"Before Main"<<endl;  
  6. }  
  7. __attribute__((destructor)) void after_main()  
  8. {  
  9.     cout<<"After Main"<<endl;  
  10. }  
  11. class AAA{  
  12.     public:  
  13.     AAA(){  
  14.         cout<<"AAA construct"<<endl;  
  15.     }     
  16.     ~AAA(){  
  17.         cout<<"AAA destructor" <<endl;  
  18.     }     
  19. };  
  20. AAA A;  
  21. int main()  
  22. {  
  23.     cout<<"in main"<<endl;  
  24.     return 0;  
  25. }  

$ make test2orm

$ ./test2對象

AAA construct
Before Main
in main
AAA destructor
After Mainit

能夠看到全局類的構造過程發生在before_main()函數前面,而析構也發生在after_main()前面.io

本站公眾號
   歡迎關注本站公眾號,獲取更多信息