今天在使用 Keil (主要是 armcc 编译器)编译代码(华大的 MCU 驱动库hc32f46x_interrupts.h / c
)的时候遇到了有 __weak 关键字的函数不起作用的问题,甚是奇怪。之前对于 __weak
关键字一直是一个简单的认知:编译器自动使用没有 __weak
的同名函数(如果有的话)替换有 __weak
关键字的同名函数,__weak 函数可以没有定义,且编译器不会报错! 至于这个参数详细的使用细节一直是一知半解,今天借此机会,以 GCC 作为对比,来学习一下 ARM 中的 __weak 关键字的具体使用!
来源
使用过 GCC 以及有 linux 编程经验的人,对于这个关键字应该不陌生。GNU 的编译器(gcc)扩展了一个关键字 __attribute__
,通过该关键字,用户可以在声明时指定特殊的属性,使用时该关键字后跟双括号内的属性,例如:__attribute__((属性名字))
。属性名字都是定义好的,Weak 属性就是其中之一:__attribute__((weak))
。在 linux 源码中,该关键字非常常见:
GCC 不多介绍,重点关注 ARM。在 ARM 编译器(armcc)中