zoukankan      html  css  js  c++  java
  • 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()前面. 

  • 相关阅读:
    [Android实例] 同一Activity的实例被多次重复创建
    js 只能输入数字和小数点的文本框改进版
    DDMS文件权限设置
    form search 带参数 提交
    Jquery-UI dialog与ZeroClipboard 冲突问题的解决
    ZeroClipboard实现跨浏览器复制
    WebSocket使用80端口的方法
    Leetcode题目:First Bad Version
    Leetcode题目:Longest Common Prefix
    Leetcode题目:Counting Bits
  • 原文地址:https://www.cnblogs.com/Huayuan/p/3072947.html
Copyright © 2011-2022 走看看