我想正确使用__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
如何正确覆盖功能?
答案 0 :(得分:4)
之所以会这样,是因为__attribute__((weak))
头文件中的common.h
声明适用于两个定义; common.c
中的一个(您打算变弱)和driverA.c
中的定义(您打算变强)。
要获得所需的行为,请在__attribute__((weak))
中而不是在头文件中应用common.c
仅 。