You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:03:14