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()前面. 

  • 相关阅读:
    缓存架构设计细节二三事
    啥,又要为表增加一列属性?
    SpringMvc4.x---快捷的ViewController
    SpringMvc4.x--@ControllerAdvice注解
    SpringMvc4.x--Spring MVC的常用注解
    解决svn--Unable to connect to a repository at URL ‘https://xxxxxx’ 问题
    或许你不知道的10条SQL技巧
    Java 基础-运算符
    Java 运算符 % 和 /
    Java基础-注释
  • 原文地址:https://www.cnblogs.com/Huayuan/p/3072947.html
Copyright © 2011-2022 走看看