C语言中,同一个函数能不能被定义两次?
稍微有点C语言基础的同学,一定知道不能这样做。
最近有同学在学习STM32,他就发现了这么一个问题,有些函数前面加了 __weak,然后这个函数就可以被重新定义。
这种情况常见于中断函数里面,意思就是用户可以自己定义,也可以用系统提供的。
__weak并不是C语言里面的关键字,具体的实现还是得看编译器。
比如在keil里面,__weak就是一个宏定义,使用了C语言里面的 attribute 机制,这个机制我们在前面也讲过,里面可以用 packed aligned unused 等等。
今天我们再来补充一个,weak。
比如在 test.c 文件中定义了函数 test,如果在 main.c 里面又定义了一次,那编译的时候,肯定会提示函数重复定义,一个函数不能被定义两次。
但是如果在某个 test 函数前面加上 __attribute__((weak)),编译就能顺利通过。
并且运行的时候,默认调用的也是前面没有 weak 修饰的函数。
weak 就是告诉编译器,该函数为弱定义,作为备选,如果用户自己定义了,还是优先调用用户定义的函数。
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网
网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
原文标题:函数也能重复定义
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
相关推荐
在C语言中,宏定义是一种预处理指令,用于在代码中定义和使用常量、函数或代码片段的替代。
发表于 08-17 15:33
•800次阅读
#define命令是C语言中的一个宏定义命令,它用来将一个
发表于 09-05 10:12
•1158次阅读
C语言中,结构体能不能相加?
发表于 12-19 17:04
•1267次阅读
求助各位大神:
小弟在此感谢:STM32F103,,希望能在一个PWM周期内对同一个AD通道采样两次?或者多次,可以控制采样起点,连续采样不合适。有什么办法吗?类似于在周期下溢点,上溢
发表于 04-17 07:25
ISO3082中两个地 GND1和GND2能不能连接到同一个地上
发表于 12-02 07:29
si4463的发送和接收r能不能使用同一个频点,怎么用?
发表于 09-14 10:07
同一个定时器,比如TIM1能不能设置通道1位定时器比较,通道2位定时器输入捕获
发表于 10-24 08:10
电池能不能修复?
电池修复作为一个新生事物,许多人对它不了解,也有许多人对它一知半解。那么电池到底能不能修复呢?
发表于 11-23 10:40
•1094次阅读
#define命令是C语言中的一个宏定义命令,它用来将一个
发表于 09-28 16:05
•3447次阅读
一个C源程序至少包括一个函数。 C
发表于 11-26 09:01
•1112次阅读
最近有位哥问我,如何给C语言中的函数定义两个不同的名字?就是这两个名字都是指向
发表于 12-19 16:21
•819次阅读
同VLAN不同的网段能不能互通? 同一个VLAN中的设备拥有相同的网络地址范围,因此它们可以通过该VLAN进行通信。而不同VLAN中的设备拥有不同的网络地址范围,它们通常不能直接互通。然而,在某些
发表于 02-04 11:21
•3080次阅读
用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
发表于 11-09 11:38
•373次阅读
C语言中的头文件能不能重复包含? 比如代码写成这样,stdio.h 连续包含了两次。 #include #include int main(){ printf("helloworld
发表于 11-26 17:19
•149次阅读
C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。 学过 C++ 的同学,应该首先能想到智能指针。 但是这是C
发表于 11-27 09:33
•107次阅读
评论