• GNU __attribute__


    在阅读TGTD的代码时发现了一个非常诡异的问题,声明了一个空的全局数组,在使用的时候却发现数组非空,在main()入口时数组已经非空.数组时在什么地方被赋值了呢?最后发现__attribute__这个东东在起作用,类似于全局变量类的构造函数在main()前被调用.

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

     
     
    #include<stdio.h>  
    __attribute__((constructor)) void before_main()  
    {  
       printf("before main\n");  
    }  
     
    __attribute__((destructor)) void after_main()  
    {  
       printf("after main\n");  
    }  
     
    int main()  
    {  
       printf("in main\n");  
       return 0;  

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

    根据上面的代码以及输出结果,我们可以猜到__attribute__((constructor))表示这段代码将在main函数前调用,就像在C++里面的全局变量类的构造一样.

    说到C++里面的全局类对象的构造,我们不禁要问全局类对象的构造跟__attribute__((constructor))以及destructor谁在前谁在后呢?

     

    #include<iostream>  
    using namespace std;  
    __attribute__((constructor)) void before_main()  
    {  
        cout<<"Before Main"<<endl;  
    }  
    __attribute__((destructor)) void after_main()  
    {  
        cout<<"After Main"<<endl;  
    }  
    class AAA{  
        public:  
        AAA(){  
            cout<<"AAA construct"<<endl;  
        }     
        ~AAA(){  
            cout<<"AAA destructor" <<endl;  
        }     
    };  
    AAA A;  
    int main()  
    {  
        cout<<"in main"<<endl;  
        return 0;  

    #include<iostream>
    using namespace std;
    __attribute__((constructor)) void before_main()
    {
        cout<<"Before Main"<<endl;
    }
    __attribute__((destructor)) void after_main()
    {
        cout<<"After Main"<<endl;
    }
    class AAA{
        public:
        AAA(){
            cout<<"AAA construct"<<endl;
        }  
        ~AAA(){
            cout<<"AAA destructor" <<endl;
        }  
    };
    AAA A;
    int main()
    {
        cout<<"in main"<<endl;
        return 0;
    }$ make test2

    $ ./test2

    AAA construct
    Before Main
    in main
    AAA destructor
    After Main

    可以看到全局类的构造过程发生在before_main()函数前面,而析构也发生在after_main()前面. 

  • 相关阅读:
    AOD.net
    C# Eval()和Bind()
    .Net使用微軟自帶的用戶驗證和登錄授權
    .Net面試4套
    .Net面試題
    MVC开发模式
    .Net自帶Ajax和GridView
    HTML系列(HTMl+CSS+JavaScript+Jquery)--un
    .Net母版页
    .NetDOM操作--un
  • 原文地址:https://www.cnblogs.com/Huayuan/p/3072947.html
Copyright © 2020-2023  润新知