gpt4 book ai didi

c++ - 弱链接的实际应用是什么?

转载 作者:IT老高 更新时间:2023-10-28 21:38:20 25 4
gpt4 key购买 nike

使用特殊的编译器命令可以声明一个符号weakAccording to Wikipedia :

a weak symbol is a symbol definition in an object file or dynamic library that may be overridden by other symbol definitions

在哪些场景或哪些应用中需要弱符号?有哪些典型用例?

最佳答案

在嵌入式开发中,例如,当您有一个中断指针 vector 时,能够使用弱链接为您不感兴趣的中断获取默认处理程序非常方便。

这通过定义一个空处理程序(一次),然后为您需要的每个中断指针引入一个新的正确命名的符号来工作,它与默认处理程序弱链接。

然后用这些符号填充 vector ,这些符号都指向相同的实际代码,直到您决定使用相同(正确)名称实现其中一个,然后您的代码“压倒”弱链接,导致指向要安装在中断表中的代码的指针。

这通常是在 C 和汇编的混合中实现的,但是使用 C 伪代码我们可能会有类似的东西:

static void placeholder_isr(void)
{
}

/* Introduce properly-named function pointers, with weak linking.
* NOTE: This syntax is completely fictional as far as I know.
*/
void (*timer1_isr)() = placeholder_isr __attribute("weak linking");
void (*timer2_isr)() = placeholder_isr __attribute("weak linking");
void (*usart1_isr)() = placeholder_isr __attribute("weak linking");
void (*usart2_isr)() = placeholder_isr __attribute("weak linking");
void (*dma1_isr)() = placeholder_isr __attribute("weak linking");
void (*dma1_isr)() = placeholder_isr __attribute("weak linking");

/* Declare the table of interrupt handlers. */
static void (*isr_table)[] = {
timer1_isr,
timer2_isr,
usart1_isr,
usart2_isr,
dma1_isr,
dma2_isr,
} __attribute("isr vector"); /* Attribute to place it where it needs to go. */

然后你可以在需要的时候实现你自己的功能:

void timer1_isr(void)
{
/* Handler ISR from timer1. */
}

无需更改任何其他内容,它“就可以工作”。当然,只要您的名字是上述“支持代码”所期望的名字。

关于c++ - 弱链接的实际应用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15525537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com