C语言中,同一个函数能不能被定义两次?
稍微有点C语言基础的同学,一定知道不能这样做。
最近有同学在学习STM32,他就发现了这么一个问题,有些函数前面加了 __weak,然后这个函数就可以被重新定义。
这种情况常见于中断函数里面,意思就是用户可以自己定义,也可以用系统提供的。
__weak并不是C语言里面的关键字,具体的实现还是得看编译器。
比如在keil里面,__weak就是一个宏定义,使用了C语言里面的 attribute 机制,这个机制我们在前面也讲过,里面可以用 packed aligned unused 等等。
今天我们再来补充一个,weak。
比如在 test.c 文件中定义了函数 test,如果在 main.c 里面又定义了一次,那编译的时候,肯定会提示函数重复定义,一个函数不能被定义两次。
但是如果在某个 test 函数前面加上 __attribute__((weak)),编译就能顺利通过。
并且运行的时候,默认调用的也是前面没有 weak 修饰的函数。
weak 就是告诉编译器,该函数为弱定义,作为备选,如果用户自己定义了,还是优先调用用户定义的函数。
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
原文标题:函数也能重复定义
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
相关推荐
在C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
发表于 08-17 15:33
•496次阅读
C语言中,结构体能不能相加?
发表于 12-19 17:04
•886次阅读
求助各位大神:
小弟在此感谢:STM32F103,,希望能在一个PWM周期内对同一个AD通道采样两次?或者多次,可以控制采样起点,连续采样不合适。有什么办法吗?类似于在周期下溢点,上溢
发表于 04-17 07:25
可以同时在一个循环里调用同一个子VI吗 这两次调用优先级是一样的 但是子VI的输入参数不一样可以
发表于 12-09 14:41
,类似于阵列信号处理那种方式。还是每次只能开启A,B,C中一个路径。2.能不能同时开始两个接收通道,接收不同频段的信号。我在看AD9361
发表于 08-29 11:27
si4463的发送和接收r能不能使用同一个频点,怎么用?
发表于 09-14 10:07
[5] = {1,2,3,4,5};array[0] = array[0]+1; //错误数组元素与变量类似,具有只读属性,不能被更改;一旦更改,如程序将会报错。3、 修饰指针C
发表于 03-29 10:53
在C语言中通常操作只有真假两种状态的的数据时使用布尔bool变量比较多,如果需要同时观察多个状态,这时候选择位操作效率会更高,用一个字节的8位分别表示8种状态。比较节省内存,处理
发表于 02-25 06:13
同一个运放电路,只是分别画了两次,在Multisim14.2仿真居然有两次不同的结果。查了半天也不知道问题在什么地方,麻烦坛子内的高手看下。*附件:Desktop.rar
发表于 10-23 19:29
读取两次
以下是SPI读取和写入使用的函数
从日志打印可以看到,第二次读取同一个地址,此时反馈为0。
麻烦各位大神帮忙看一下,是哪里写的有问
发表于 08-20 15:24
C语言中怎么定义一个不定长度的数组
发表于 10-09 07:40
同一个定时器,比如TIM1能不能设置通道1位定时器比较,通道2位定时器输入捕获
发表于 10-24 08:10
四个超声波模块的发射脚能不能接在同一个单片机引脚
发表于 10-26 06:34
电池能不能修复?
电池修复作为一个新生事物,许多人对它不了解,也有许多人对它一知半解。那么电池到底能不能修复呢?
发表于 11-23 10:40
•1020次阅读
最近有位哥问我,如何给C语言中的函数定义两个不同的名字?就是这两个名字都是指向同一个函数,同一个
发表于 12-19 16:21
•408次阅读
评论