gpt4 book ai didi

c - 如何正确使用 "weak"?或 C 函数覆盖

转载 作者:太空狗 更新时间:2023-10-29 17:12:11 25 4
gpt4 key购买 nike

我想正确使用 __attribute__((weak)) 来实现函数覆盖。

我的代码没有按预期工作。有什么问题吗?


common.h

#include <stdio.h>

int __attribute__((weak)) doJob1(void);
int __attribute__((weak)) doJob2(int, int);

typedef int (*Job1)(void);
typedef int (*Job2)(int, int);

common.c

#include <stdio.h>
#include "common.h"

__attribute__((weak)) int doJob1(void)
{
printf("doJob1 common WEAK\n");
return 0;
}

__attribute__((weak)) int doJob2(int a, int b)
{
printf("doJob2 common WEAK\n");
return 0;
}

driverA.c

#include <stdio.h>
#include "common.h"

int doJob1(void)
{
printf("doJob1 driverA Strong\n");
}

void main()
{
Job1 j1 = doJob1;
Job2 j2 = doJob2;

j1();
j2(0, 0);
}

当我运行程序时,我看到:

sh> ./a.out
doJob1 common WEAK
doJob2 common WEAK

我期望的是这个结果,而不是:

sh> ./a.out
doJob1 driverA Strong
doJob2 common WEAK

如何获得预期的结果?

总的来说,有很多形式为“Job1”、“Job2”...“JobXX”的函数。driverA 想对少数工作使用自己的函数,对某些工作使用公共(public)函数,并且某些函数将为 NULL:

ex> 
Job1 - driverA_Job1
Job2 - common Job2
Job3 - NULL
..

不同的驱动程序,比如驱动程序 B,可能会做出不同的选择:

Job1 - common job1
job2 - B's own job2
job5 - NULL

如何正确覆盖函数?

最佳答案

这是因为 common.h 头文件中的 __attribute__((weak)) 声明适用于这两个定义; common.c 中的那个(你打算变弱)以及 driverA.c 中的定义(你打算变强)。

要获得您想要的行为,请在 common.c 中应用 __attribute__((weak)) >,而不是在头文件中。

关于c - 如何正确使用 "weak"?或 C 函数覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56341717/

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