C 什么是弱函数?它们的用途是什么?我使用的是stm32f429微控制器
维基百科说: 弱符号表示链接过程中的特殊注释符号 可执行和可链接格式(ELF)对象文件。默认情况下,没有 任何注释,对象文件中的符号都是强的。在连接过程中,, 强符号可以替代同名的弱符号。在里面 相反,共享名称的两个强符号会产生链接错误 在连接时间内。链接二进制可执行文件时,弱声明 符号不需要定义。相比之下,(默认情况下)a 未定义的声明强符号触发未定义的 符号链接错误。C或C++语言中没有提及弱符号 标准;因此,将它们插入到代码中不是很容易移植的。 即使两个平台支持相同或相似的标记语法 由于符号很弱,语义可能在细微之处有所不同,例如。 运行时动态链接期间的弱符号是否丢失 语义与否 弱函数是什么?它们的用途是什么?我使用的是stm32f429微控制器。图书馆有一些薄弱的功能。但我不明白,它们是什么和它们的用途C 什么是弱函数?它们的用途是什么?我使用的是stm32f429微控制器,c,stm32f4discovery,stm32f4,stm32ldiscovery,C,Stm32f4discovery,Stm32f4,Stm32ldiscovery,维基百科说: 弱符号表示链接过程中的特殊注释符号 可执行和可链接格式(ELF)对象文件。默认情况下,没有 任何注释,对象文件中的符号都是强的。在连接过程中,, 强符号可以替代同名的弱符号。在里面 相反,共享名称的两个强符号会产生链接错误 在连接时间内。链接二进制可执行文件时,弱声明 符号不需要定义。相比之下,(默认情况下)a 未定义的声明强符号触发未定义的 符号链接错误。C或C++语言中没有提及弱符号 标准;因此,将它们插入到代码中不是很容易移植的。 即使两个平台支持相同或相似的标记语法 由于符
我在谷歌上搜索了一下,但没有得到满意的答案 当函数前面有描述符_弱时,它基本上意味着如果您(编码者)没有定义它,它就在这里定义 让我们看看我的死敌“HAL_UART_RxCpltCallback()” 此函数存在于STM32F4-HAL代码库的HAL中,可从ST Micro下载 在文件stm32f4xx_hal_uart.c中,您会发现此函数定义为:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
因此,正如代码中的注释所述,将此函数放在您自己的用户文件中。但是,在执行此操作时,不要输入弱术语。这意味着链接器将接受您对HAL_UART_RxCpltCallback()函数的定义,而不是stm32f4xx_HAL_UART.c文件中定义的函数
这使泛型代码库能够始终编译。您不必编写一大堆您不感兴趣的函数,但它会编译。当需要编写自己的代码时,您只需不将自己的代码定义为\uuu-weak
并编写它即可
简单?有用吗
干杯 除了“这使泛型代码库能够始终编译。”\uuuu-weak允许您重新生成(在CubeMX中)代码,而无需接触您的uu-weak+less回调函数代码。
如果您使用以下格式编写代码:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
出于某种原因,在cubemx中进行再生。你的密码会爆炸 弱函数是可以被具有相同名称的用户函数覆盖的方法,用于定义向量表和默认处理程序 正常的函数编写(声明和定义)被认为意味着函数名不能被重新声明,您将得到编译器/链接器错误 将函数声明为可被用户代码覆盖的星期
void USART1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
uint32_t vectors[75] __attribute__((section(".isr_vector")));
vectors[0] = STACK_START;
vectors[52] = USART1_IRQHandler;
void Default_Handler(void) {
while(1);
}
uart1.c (user code)
void USART1_IRQHandler(){
...
}
在上面的示例代码中,USART1_IRQHandler被定义为弱函数,并别名为Default_handler
如果用户在uart1.c中定义USART1_IRQHandler,则用户可以使用相同的名称重写此函数,而不会出现任何编译器/链接器错误。将使用此新函数定义