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

  • 相关阅读:
    vb学习笔记
    spfa模版
    spfa slf优化
    接口总结
    SAP屏幕穿透
    判断可编辑字段,用户输入的数据是否为纯数字(包含带小数点的小数)
    对于ALV中的可编辑字段,当输入的数据不满足某种条件时,我们需要将它恢复到修改前的数据,并刷新ALV。但是可编辑的字段刷新后仍然时修改后的数据,此处记录一种方法。
    ALV中可编辑字段数据变化时,对变化的数据进行操作。
    通过UPDATE 往数据库中更新数据
    SE16N 中设置为可编辑状态
  • 原文地址:https://www.cnblogs.com/Huayuan/p/3072947.html
Copyright © 2020-2023  润新知