__attribute__((used))是否作用于STM32启动代码中其后的所有函数?
问题解答:
__attribute__ ((used))的作用范围 在你贴的STM32F4启动代码里,__attribute__ ((used))只会作用于紧挨着它的Reset_Handler函数声明,不会影响后面的NMI_Handler、HardFault_Handler等其他函数。
核心原因
GCC编译器的属性规则明确:这类函数属性是绑定到紧邻的单个函数声明/定义上的,每个函数声明都是独立的实体。如果要给多个函数批量加上used属性,必须用逗号分隔的声明语法(比如__attribute__((used)) void func1(void), func2(void);),但你贴的代码里每个函数都是单独成行的独立声明,所以属性只会作用于第一行的Reset_Handler。
结合STM32场景的补充说明
__attribute__((used))的核心作用是强制编译器保留该函数,哪怕编译器检测不到任何显式的代码调用。Reset_Handler是芯片上电启动时硬件直接跳转的入口函数,编译阶段编译器看不到任何代码对它的调用,必须加这个属性防止被误优化。
而后面的中断函数虽然标注了WEAK(弱定义),但它们的地址会被写入启动文件的中断向量表数组中,编译器能识别到这种间接引用,所以即使不加used属性,默认的空实现弱函数也不会被优化掉——如果用户自己重定义了这些中断函数,弱定义的版本会被自动覆盖。
内容的提问来源于stack exchange,提问作者jackfrost
相关产品推荐
相关产品推荐

