zoukankan      html  css  js  c++  java
  • 特殊的attribute机制

    __attribute__机制是GNU C的一大特色,可以用来设置函数,变量和数据类型的属性,下面对工作中正好用到的两个属性做下简单介绍。

    1. constructor

    这个属性指定函数在main函数执行之前执行

    static void RunBeforeMain(void) __attribute__ ((constructor));
    
    void RunBeforeMain(void){
        printf(“%s 
    ”,  __FUNCTION__);
    }
    int main(void){
        printf(“%s
    ”,__FUNCTION__);
        return 0;
    }

    输出顺序如下:

    RunbeforeMain

    main

    2. weak, alias

    weak: weak symbol. 若存在两个相同的全局符号时,会引发重定义错误. 如果使用weak attribute,则当weak symbol和non-weak symbol同时存在的时候,linker会使用non-weak symbol.若只有weak symbol存在的时候则只使用weak symbol.

    alias: 设置函数的别名,如

    void example() __attribute__((alias("__example")));

    将example函数设为__example的别名

    这两个属性结合起来使用可以在non-weak symbol没有声明的情况下仍然编译执行成功。

    //strong.c

    #include <stdio.h>

    void StrongFun ( ) { printf("%s:%s ", __FILE__,__FUNCTION__); }

    //weak.c

    #include <stdio.h>
    
    void StrongFun()__attribute__((weak, alias("WeakFun")));
    
    void WeakFun ( ) {
        printf("%s:%s
    ", __FILE__, __FUNCTION__);
    }
    
    int main(int argc, char **argv){
        StrongFun();
        return 0;
    }

    单独链接时,

    gcc -o weak weak.o

    ./weak

    输出结果:

    weak.c:WeakFun

    同时链接时,

    gcc -o strong weak.o strong.o

    ./strong

    输出结果

    strong.c:StrongFun


    作者:coderkian
    出处:http://www.cnblogs.com/coderkian/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Redis主从同步分析(转)
    Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】(转)
    PHP之PDO_MYSQL扩展安装步骤(转)
    MongoDB 那些坑(转)
    CF 222 (DIV 1)
    TC SRM601
    TC SRM600 DIV2
    Github入门教程
    2013长春区域赛总结
    退役了~~~~~~~~~~~~
  • 原文地址:https://www.cnblogs.com/coderkian/p/3454946.html
Copyright © 2011-2022 走看看