如何正确使用“弱引用”?或C函数覆盖。

7

我希望正确使用__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想要使用自己的函数处理部分作业,并对一些作业使用通用函数,还有一些函数将为空:

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

另一位司机,比如司机B,可能会做出不同的选择:

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

如何正确覆盖函数?


5
你如何编译你的代码? - Killian G.
4
如果你通过函数指针调用函数,为什么需要使用函数重写(function overriding)呢? - John Bollinger
1
C语言中的函数重载听起来很奇怪。 - Mayur
5
听起来像是一个典型的“XY 问题”,你正在询问如何修复实现,这是解决实际问题的错误方法。需要注意的几点是:- 函数重载是一个非常危险的特性, 因此没有理智的语言支持它, 这是因为很多很好的原因。意外调用错误函数是其中一个主要原因。- 在 C 中进行泛型编程或多态性可以/应该使用函数指针。- 测试目的的“Mock”函数替换可以/应该使用#define - Lundin
3
编译命令非常关键。库的顺序和参数的顺序以及 -Wl,-whole-archive 参数都很重要。您需要展示您如何编译代码。 - KamilCuk
显示剩余4条评论
1个回答

4
这是因为在common.h头文件中的__attribute__((weak))声明适用于BOTH定义,包括您打算弱化的common.c中的定义和您打算加强的driverA.c中的定义。
要获得所需的行为,请仅在common.c中应用__attribute__((weak)),而不是在头文件中应用。

尽管我试图将"main"函数移动到common.c中,并且也很顺利地运行了,但是我还是赶不上它。这个测试代码很好用。谢谢 :) - AlanJay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接