什么是强符号和弱符号?

在c语言中,函数和初始化的全局变量是强符号,未初始化的全局变量是弱符号。强符号和弱符号的定义是连接器用来处理多重定义符号的,它的规则是:不允许多个强符号;如果一个强符号和一个弱符号,这选择强符号;如果多个弱符号,则任意选一个。

使用__attribute__((weak))的场景

A,B两个模块,A模块调用了,但是不确定B模块是否提供了函数,但是又不得不调用,这个时候在A模块中再申明一个弱符号函数,即用weak,如果外部提供了调用外部的,如果没提供调用申明的。在工作当中就是在保证在没有链接某个库时能编译通过。假设现在有一个库,支持a、b、c三种模式,并且同时只能有一种模式生效,可以适配三种类型的设备。如果想要a模式,那就没有必要去链接b、c模式依赖的库,像调用普通函数一样,肯定会报函数未定义错误,因为你没有链接相关库。这时我们只需要把函数在本模块声名时都加上__attribute__((weak)),这样链接就可以通过。(在这种情况,必须得确保a模式下,程序运行中不会调用b、c模式的函数,否者会造成程序崩溃,因为你没有链接相关库,函数是没有定义的,只是欺骗编译器让编译通过)

attribute((weak))的作用:

弱符号函数使模块的函数转换为弱符号类型,连接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号。只存在弱符号,则选择弱符号。

#示例代码:

#include <stdio.h>void __attribute__((weak)) func();
//extern void func();
void main()
{if(func != NULL){func();}
}

代码解析:

当我们用__attribute__((weak))修饰func()函数后,func就是一个弱符号。不管外部是否定义了func()我们都可以链接通过,当外部定义了就调用外部的func函数,当外部没有定义时就调用本模块的func函数。但实际上本模块并没有定义func函数,所以在调用时我们判断一下函数指针是否为空,以免造成段错误。如果我们用extern来声名函数,当外部没有定义该函数时就会报错,导致编译不过。

__attribute__((weak))介绍以及用法相关推荐

  1. __attribute__((weak)) 用法

    我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数. 一.问题声明 extern int func(void); //声明函数,告诉编译器不要管 .................. ...

  2. ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用

      今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚 ...

  3. __weak 和 __attribute__((weak)) 关键字的使用

    今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚是奇 ...

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

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

  5. Java 动态代理介绍及用法

    Java 动态代理介绍及用法 一,静态代理模式的特点 在之前的文章中 java代理模式 已经介绍里java里的(静态)代理模式 下面是上文静态代理类的例子: public class ProxyBea ...

  6. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  7. chrome介绍与用法

    chrome介绍与用法 chrome介绍与用法 1. 认识devTools Elements 面板 console控制面板 Sources 资源面板 chrome介绍与用法 1. 认识devTools ...

  8. __attribute__((weak)):弱引用,可以不实现

    #include <stdio.h>#define __weak __attribute__((weak)) //变量加上weak时,是弱符号.函数加上weak时,是弱引用,可以不实现. ...

  9. __attribute__((weak))是什么意思

    最近在阅读tcmalloc代码时发现使用了很多__attribute__((weak)),上网搜了以下有所了解. 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak ...

最新文章

  1. 无盘工作站 服务器 性能,无盘工作站与有盘工作站比较,突出的优势有哪些?...
  2. 安装 Windows 7 64位系统 相关注意事项
  3. 为什么说 Java 是按值传递的?
  4. leetcode 145 --- 二叉树后序遍历
  5. HTML+CSS+JS实现 ❤️响应式的幸运大转盘❤️
  6. UVA - 699 The Falling Leaves
  7. 高并发高可用系统的常见应对策略
  8. find的详细用法及其例子
  9. java各层_java后台各个层理解
  10. 分享一些前端优质的掘金小册,学完技术感觉已经超神了
  11. Mandriva本地安装
  12. PAT.1143 Lowest Common Ancestor
  13. Install VirtualBox Guest Additions for elementary os
  14. axure元件制作-常用开关
  15. 2009年经典语录雷人总汇
  16. 网络——介质访问控制
  17. 计算机直接切换到桌面,屏幕如何快速切换桌面
  18. 隐马尔科夫(HMM)模型
  19. 1985年全国计算机编程大赛,关于举办2021年“中国高校计算机大赛-团体程序设计天梯赛”校内选拔赛的通知...
  20. 飞思卡尔智能车 电机PID

热门文章

  1. Linux那些事儿之我是SCSI硬盘(6)三座大山(三)
  2. Linux批量创建文件的命令,Linux中常用的批量操作文件命令
  3. PyCharm使用venv虚拟环境
  4. 如何将CAD图纸复制到另一张图纸上?
  5. C++11学习笔记: auto关键字
  6. php和shell脚本语言,将PHP作为Shell脚本语言使用_PHP教程
  7. 【Rust日报】 2019-06-10:「嵌入式Rust」使用STM32 Blue Pill在Apache Mynewt上托管嵌入式Rust应用程序...
  8. 【C#项目】图书馆管理系统-WinForm+MySQL
  9. 全球及中国工业节能行业“十四五”动态调研及投资可行性研究报告2021-2027年
  10. Qt实现文件拷贝递归实现