如何正确使用“弱”?或C函数替代

时间:2019-05-28 11:55:15

标签: c gcc

我想正确使用__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希望将其自身的功能用于少量作业,而将公共功能用于某些作业,并且某些功能将为NULL:

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

不同的驱动程序(例如driverB)可能会做出不同的选择:

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

如何正确覆盖功能?

1 个答案:

答案 0 :(得分:4)

之所以会这样,是因为__attribute__((weak))头文件中的common.h声明适用于两个定义; common.c中的一个(您打算变弱)和driverA.c中的定义(您打算变强)。

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