GCC对C/C++做了很多扩展,很多基于Linux环境的开源项目都会使用。本文介绍一下弱符号的应用。

对于大型项目特别是兼容多种平台的项目来说,同一功能的实现会区别于不同平台,比如linux内核,比如coreboot。有的平台可能没有该功能接口,但顶层调用会使用到这个接口,为了不使链接出错,往往就使用到弱符号来解决。使用弱符号函数时,假如此项目工程没有其它同名的函数(可以认为是“强符号”),则调用该函数;如果其它文件也实现了同一名称函数,则调用其它文件的实现函数。

弱符号链接使用很简单,在函数实现加上“__attribute__ ((weak)) ”即可。对于调用者来说没有任何区别。下面的示例中,声明了一个名叫foobar,foodummy.c中是弱符号的实现,foo.c是“强符号”的实现,在main.cpp中调用foobar函数。同时将这3个文件编译,并不会出错,执行结果是打印foo.c中的函数。如果只编译main.cpp和foodummy.c,则会调用到foodummy.c的函数。

注:将doodummy.c的weak属性去掉,编译3个文件,编译器报重定义错误。

头文件声明foo.h:

#ifndef FOO_H
#define FOO_H

#ifdef __cplusplus
extern "C" {
#endif

void foobar(void);

#ifdef __cplusplus
}
#endif

#endif // FOO_H

弱符号链接实现文件dummyfoo.c:

#include "foo.h"
#include <stdio.h>

// 弱链接,外部没有实现时,则调用此处函数
void __attribute__ ((weak)) foobar(void)
{
    printf("dummy foobar...\n");
}

真正实现文件foo.cpp:

#include "foo.h"
#include <stdio.h>

void foobar(void)
{
    printf("realy......\n");
}

主函数main.cpp:

#include "foo.h"

#include <stdio.h>

int main(void)
{
    printf("test of weak link......\n");
    foobar();
    
    return 0;
}

后记:实际工作中需要使用一套驱动上层接口的库,这套使用用于不同的SOC,不同的业务程序,对外提供的接口形式不变,所有产品可能都有LED灯,但有的产品没有RS485,有的产品没有FLASH,有的产品没有CPLD,等等。如果不希望这套库为每个产品都重新整理一遍所有接口,在此情况下,weak属性将发挥其强大功能。所有接口都有对应的weak的实现,但对于具体的产品,如果没有某一模块,删除其实现,由于存在weak的实现,不会出现找不到函数定义的错误,只需关注真正需要使用的部分接口即可。

李迟 2016.2.29 周一 晚

GCC弱符号的一个应用示例相关推荐

  1. 【嵌入式】C语言高级编程-强符号和弱符号(09)

    00. 目录 文章目录 00. 目录 01. weak属性 02. 变量强符号和弱符号 03. 函数强符号和弱符号 04. 弱符号的作用 05. alias属性 06. 附录 01. weak属性 G ...

  2. C语言:__attribute__((weak)) 弱符号与__attribute__ ((weakref())弱引用

    C语言中的__attribute__((weak)) 与 __attribute__((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 ...

  3. 详解 C 语言中的弱符号与弱引用

    C语言中的__attribute__((weak)) 与 attribute ((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 C ...

  4. GCC中的弱符号与强符号

    转载自 https://www.cnblogs.com/kernel_hcy/archive/2010/01/27/1657411.html 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中 ...

  5. 关于GCC属性中的弱符号(weak symbol)

    关于弱符号的解释: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号来解析 ...

  6. 弱符号与弱引用 -> 程序员的自我修养 第3,4章笔记

    1. 在程序中声明并使用节名 先看下面一段有意思的程序 #include <stdio.h>__attribute__((section("abcd"))) int s ...

  7. C语言中的弱符号与强符号介绍

    弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF,可执行和可链接格式,是一种用于可执行文件.目标文件.共享库和核 ...

  8. 13.强符号和弱符号

    我们在编写代码的过程中经常会遇到一种叫做符号重复定义(Multiple Definition)的错误,这是因为在多个源文件中定义了名字相同的全局变量,并且都将它们初始化了. 例如,在 a.c 中定义了 ...

  9. 新手小心:c语言的强符号和弱符号

    声明:下面的实例全部在linux下尝试,window下未尝试.有兴趣者可以试一下.文章针c初学者. c语言的强符号和弱符号是c初学者经常容易犯错的地方.而且很多时候,特别是多人配合开发的程序,它引起的 ...

最新文章

  1. Spring.NET的AOP怎么玩
  2. BZOJ2150: 部落战争
  3. @echo off是什么意思_高街、BF、FOG、OS风。。。都是些什么鬼?
  4. ubuntu没有进入图形界面解决办法
  5. HTML meta 标签 和 http-equiv
  6. 内网配置DNS服务器,无域名,只有主机名
  7. 数据结构与算法python—5.队列及python实现与leetcode总结
  8. 163个人邮箱注册申请流程,公司邮箱怎么注册?
  9. 台式计算机diy,DIY组装台式电脑经验分享学习篇
  10. 脚本小子_python数据类型代码
  11. 思科cisoc 路由器IKEv2使用map配置隧道
  12. 用久的苹果电脑是闲置回收还是维修
  13. tmooccn达内登录_达内上线技术学习平台TMOOC.CN,由线下反攻线上,O2O是在线教育的出路?...
  14. 给一个长度为n的字符串,找出长度为m的最小字典子序列【单调栈】
  15. 特斯拉服务器位置,特斯拉云服务器
  16. 三菱GX works2的应用安装
  17. 一款可以颠覆做网站方式的软件
  18. MT6595发布会信息汇总
  19. python中copy()和deepcopy()详解
  20. 一站式SCI投稿大全(感谢pennhmp116版主的整理)

热门文章

  1. 女孩子怎样能赚到月薪一万
  2. 什么值得买发布年货消费报告 预制菜GMV同比增长39.41%
  3. 微博月活跃用户数增至5.73亿 移动端用户占比达94%
  4. 英特尔Bridge技术加持下 Windows 11 PC也能运行手机应用
  5. 张朝阳:未来文娱重点将拍更多网剧 发展UGC、短视频社交和直播社交
  6. 腾讯申请自动驾驶相关专利 可实现自动变道
  7. 手持iPhone 12测温测出80度?安兔兔致歉:测温枪年久失修!
  8. BOSS直聘发起“逆行者先行”招聘专场:优先录取抗疫志愿者
  9. 网友评荣耀V30:同价位无对手 除了双模5G和价格还有哪些原因
  10. 今年全国累计电影票房已破500亿 40亿以上票房仅3部