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

2024-05-26 20:32

本文主要是介绍Keil 编译器特有的功能 关键字和运算符 __weak,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于Keil 编译器特有的功能 关键字和运算符 __weak的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005508

相关文章

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

Python实现自动化表单填写功能

《Python实现自动化表单填写功能》在Python中,自动化表单填写可以通过多种库和工具实现,本文将详细介绍常用的自动化表单处理工具,并对它们进行横向比较,可根据需求选择合适的工具,感兴趣的小伙伴跟... 目录1. Selenium简介适用场景示例代码优点缺点2. Playwright简介适用场景示例代码

MySQL中闪回功能的方案讨论及实现

《MySQL中闪回功能的方案讨论及实现》Oracle有一个闪回(flashback)功能,能够用户恢复误操作的数据,这篇文章主要来和大家讨论一下MySQL中支持闪回功能的方案,有需要的可以了解下... 目录1、 闪回的目标2、 无米无炊一3、 无米无炊二4、 演示5、小结oracle有一个闪回(flashb

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

基于Python和Tkinter实现高考倒计时功能

《基于Python和Tkinter实现高考倒计时功能》随着高考的临近,每个考生都在紧锣密鼓地复习,这时候,一款实用的倒计时软件能有效帮助你规划剩余时间,提醒你不要浪费每一分每一秒,今天,我们来聊聊一款... 目录一、软件概述:二、功能亮点:1. 高考倒计时2. 添加目标倒计时3. 励志语句4. 透明度调节与

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短