• Keil> 编译器特有的功能 > 关键字和运算符 > __weak


    __weak

    此关键字指示编译器弱导出符号。

    可以将 __weak 关键字应用于函数和变量声明以及函数定义。

    用法

    函数和变量声明

    对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不会导致链接器将未解析的引用作为错误处理。

    例如:

    __weak void f(void); ... f(); // call f weakly

    如果从编译为跳转或跳转链接指令的代码中对缺少的弱函数进行引用,则会:

    • 将该引用解析为下一条指令的跳转。这实际上将跳转变为 NOP

    • 将该跳转替换为 NOP 指令。

    函数定义

    使用 __weak 定义的函数将弱导出其符号。除非将相同名称的非弱定义函数链接到相同映像上,否则弱定义函数的行为与正常定义的函数类似。如果非弱定义函数和弱定义函数位于相同映像中,则会将对弱定义函数的所有调用解析为对非弱函数的调用。如果有多个可用的弱定义,链接器将选择其中的一个弱定义供所有调用使用。

    如果使用 __weak 声明函数,但随后没有使用 __weak 对其进行定义,则此函数与非弱函数的行为相同。

    限制

    使用 __weak 限定函数和变量声明以及函数定义时,存在一些限制。

    函数和变量声明

    在同一编译中,不能既弱使用又非弱使用函数或变量。例如,以下代码从 g() 和 h() 中弱使用 f()

    void f(void); void g() {     f(); } __weak void f(void); void h() {     f(); }

    无法从定义某个函数或变量的同一编译中弱使用该函数或变量。以下代码从 h() 中非弱使用 f()

    __weak void f(void); void h() {     f(); } void f() {}

    链接器不会从库中加载函数或变量,除非其他编译非弱使用该函数或变量。如果一直没有解析引用,则假定其值为 NULL。但是,如果引用是指从代码中对位置无关节或缺少的 __weak 函数的引用,则未解析的引用不是NULL

    函数定义

    无法内联弱定义的函数。

    注:此文章为转载,原文章地址:http://blog.sina.com.cn/s/blog_62d3426b0100g7n6.html

  • 相关阅读:
    Ubuntu Linux Matlab 安装 中文乱码 桌面启动器 Could not find the main class: java/splash.png. 终端terminal 直接运行 matlab
    Ubuntu Linux 官网 u盘安装 u盘系统 图文教程
    从google map google earth获得大图 方法总结
    论文查重网址
    [ZZ] Computer Science Conference Rankings
    Ubuntu linux 信使 iptux Window 飞鸽 ipmsg 飞秋 feiq 文件传输
    Ubuntu Linux Matlab mex
    Ubuntu Dell OptiPlex 990 Intel Gigabit CT Desktop Adapter网卡驱动安装
    C++的File类文件操作
    GIS软件比较
  • 原文地址:https://www.cnblogs.com/121792730applllo/p/5283136.html
Copyright © 2020-2023  润新知