如果你是写上层代码的程序员(名叫上上),需要下层程序员(名叫下下)提供一个新的API,为了保证版本库里的代码至少是可编译成功的,上上就不得不等下下把API提交,在下下的库文件和头文件发布到上上要改的工程之后,上上才能提交代码。

今天这个东西就可以让上上谁也不用等,直接提交代码,早早下班。

weak symbol

弱符号,这涉及到编译中符号的概念。在Linux开发环境中,有强符号和弱符号,符号简单来说就是函数、变量的名字,对于全局(非局部、非static)的函数和变量,能不能重名是有一定规矩的,强、弱符号就是针对这些全局函数和变量来说的。

符号类型

对象

函数名,赋初值的全局变量

未初始化的全局变量

当代码中同时存在多个强或弱的全局变量时,要遵守如下规则

强符号只能定义一次,否则编译错误

强弱符号同时存在,以强符号为准

没有强符号,则从多个弱符号中任选一个,用–fno-common编译选项可以在这种情况下打出warning

弱符号的声明

弱符号的声明有两种方式

第一种,用__attribute__((weak))修饰,例如

void __attribute__((weak)) func(void);

extern int __attribute__((weak)) var;

第二种,用#pragma weak标记,例如

#pragma weak func

代码演示

main.c

这个文件中main函数调用了2个声明为弱符号的函数,它们是weak0和weak1

#include void __attribute__((weak)) weak0(void);

void __attribute__((weak)) weak1(void);

int main(int argc, char **argv){

//尝试调用弱符号函数weak0

if (weak0){

weak0();

}

else{

printf("weak0=%p\n", weak0);

}

//尝试调用弱符号函数weak1

if (weak1){

weak1();

}

else{

printf("weak1=%p\n", weak0);

}

return 0;

}

weak.c

这个文件中定义了2个函数(它们还是weak0和weak1),并强制声明为弱符号

#include //标记weak0为弱符号

#pragma weak weak0

//标记weak1为弱符号

void __attribute__((weak)) weak1(void);

static char *label = "weak";

void weak0(void){

printf("[%s]%s is called\n", label, __FUNCTION__);

}

void weak1(void){

printf("[%s]%s is called\n", label, __FUNCTION__);

}

strong.c

这个文件中重复定义(与上面重复)了两个函数,它们又是weak0和weak1

#include //两个函数都[不]声明为弱符号

//#pragma weak weak0

//void __attribute__((weak)) weak1(void);

static char *label = "strong";

void weak0(void){

printf("[%s]%s is called\n", label, __FUNCTION__);

}

void weak1(void){

printf("[%s]%s is called\n", label, __FUNCTION__);

}

编译与输出

编译main.c

当弱符号函数链接不成功,处于未定义状态时,其名字所代表的地址为nil。

#gcc main.c -o test && ./test

weak0=(nil)

weak1=(nil)

编译main.c+weak.c

弱符号链接成功时,可以被正常调用。

#gcc main.c weak.c -o test && ./test

[weak]weak0 is called

[weak]weak1 is called

编译main.c+weak.c+strong.c

当强符号定义出现时,弱符号定义不起作用。

#gcc main.c weak.c strong.c -o test && ./test

[strong]weak0 is called

[strong]weak1 is called

上上如何提前下班呢?

他可以直接将新的API声明为弱符号函数,如果函数名地址非空,则可以调用,否则就维持原始逻辑,完全可能和下下一起下班。

对于全局变量,可以有类似的做法吗?

c语言weak void,浅尝辄止5-C语言-weak symbol相关推荐

  1. c语言编程 sort()什么意思,void sort在C语言中什么意思?

    void是C语言中的一个关键字,其含义因其应用形式不同,一般分为两种:void和void * void的字面意思是"无类型",void *则为"无类型指针",v ...

  2. c语言void形式的函数,C语言的void类型

    void类型 void的字面意思是"无类型",void * 则为无类型指针,void *可以指向任何类型的数据. void几乎只有"注释"和限制程序的作用. v ...

  3. c语言里void什么作用,c语言中void的含义是什么?如何使用?

    c语言中void的含义是什么?如何使用? 发布时间:2020-04-26 14:08:27 来源:亿速云 阅读:416 作者:小新 c语言中void的含义是什么?如何使用?相信有很多人都不太了解,今天 ...

  4. c语言使用node类型指针,C语言利用 void 类型指针实现面向对象类概念与抽象

    不使用C++时,很多C语言新手可能认为C语言缺乏了面向对象和抽象性,事实上,C语言通过某种组合方式,可以间接性的实现面对对象和抽象. 不过多态和继承这种实现,就有点小麻烦,但是依然可以实现. 核心: ...

  5. 有n个学生选修了c语言程序设计这门课程,C语言程序设计报告学生选修课系统(18页)-原创力文档...

    C 语 言 程 序 设 计 学校: 学院: 班级序号: 学号: :姓名 指导老师: C语言程序设计报告 一.C语言课程设计的目的: 高级语言课程设计是学习完<高级语言程序设计>课程后进行的 ...

  6. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...

    语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...

  7. c语言输入后没答案,C语言章节习题及答案(无指针)解读.doc

    C语言章节习题及答案(无指针)解读 <C程序设计>复习题集 第2章 基础概念 一.选择题(在下列各题的A).B).C).D)四个选项中,只有一个选项是正确的) 2.1以下叙述中正确的是 A ...

  8. c语言既适合于开发,C语言试题及答案 (1)

    C语言试题及答案 (1) 文章<C语言试题及答案 (1)>是由[作文仓库]的会员[我这么冷你怕不怕]为大家整理并分享的,仅供大家参考,欢迎阅读! 第1章 C语言概述习题 1. 单项选择题 ...

  9. 【Go语言】【14】GO语言的接口类型

    1.什么是接口? 在面向对象的语言中,接口是用来限制实现类行为的.怎么理解这句话呢? 定义一个Person接口,我只会站在我的角度上考虑问题,比如Person(人),自然想到会吃饭.睡觉等: inte ...

  10. 北京科技大学C语言程序设计,北京科技大学《C语言》第1章.ppt

    <北京科技大学<C语言>第1章.ppt>由会员分享,可在线阅读,更多相关<北京科技大学<C语言>第1章.ppt(36页珍藏版)>请在装配图网上搜索. 1 ...

最新文章

  1. C++中的sizeof与strlen对比
  2. 论坛报名 | NLP 是否到了产业应用的黄金时代?
  3. 14.3.1 调用系统的拍照功能
  4. JAVA线程本地变量ThreadLocal和私有变量的区别
  5. c语言用什么能暂存结构指针,c语言中什么是指针
  6. go struct{} 空结构体的特点和作用
  7. TODO:Laravel增加验证码
  8. matlab gui 密码登录 论文,MATLAB GUI 密码输入
  9. python密码传参有特殊字符如何解决_无法在python selenium scrip中使用带有特殊字符“$”的密码...
  10. Integer.ParseInt()异常
  11. 对step文件进行信息抽取算法
  12. splay详解(二)
  13. 教师信息管理系统——c语言(附N-S图)
  14. 项目计划概述及计划过程
  15. Git正解 脱水版 【9. 其他VCS系统】
  16. PostgreSQL的学习心得和知识总结(五十三)|语法级自上而下完美实现MySQL数据库的 insert set 的实现方案
  17. 直播电商平台开发,video组件实现视频弹幕功能
  18. Storm-电商实时交易风控系统
  19. 现代企业管理-计划和目标
  20. 第07课:使用 HTML 5 API 创建子窗口

热门文章

  1. 软件测试周刊(第08期):大过节的
  2. 文件包含小总结 By Assassin
  3. 现在1分、2分、5分硬币的收藏价格如何呢?
  4. java程序员修炼教学视频,快来看鸭~
  5. MySQL查询不同年份母亲节_日期习俗大不同,走近七个国家的母亲节!
  6. c语言地铁系统设计,城市地铁报站系统设计.doc
  7. unity2d物体3d效果
  8. 电子计算机的字母是什么意思,计算器上的英文字母
  9. python模拟计算器程序代码_python作业:模拟计算器
  10. java脚本引擎parseint方法_autojs脚本引擎调用java的jsoup爬取科学网博客的指定id的好友名字...