我们假设下面的C代码:
foo_bar_run.c
#include "foo_bar_run.h"
int __attribute__((weak)) foo()
{
printf("foon");
}
int bar()
{
printf("barn");
foo();
}
foo_bar_run.h
#include <stdio.h>
extern int __attribute__((weak)) foo() ;
extern int bar();
another_main.c
#include "foo_bar_run.h"
int main(void)
{
bar();
}
bar_test.c
#include <stdio.h>
#include "foo_bar_run.h"
int foo()
{
printf("stubbed foon");
}
int main(void)
{
bar();
}
我想有两个独立的程序:
main_run
gcc another_main.c foo_bar_run.c -o main_run && ./main_run
bar
foo
main_test
gcc bar_test.c foo_bar_run.c -o main_test && ./main_test
bar
stubbed foo
是否有更优雅的解决方案,不包括改变foo_bar_run原型?(它将保持int foo()
)
类似于用__attribute__(strong)
定义bar_test.c/foo()或者没有使用任何__attribute__
关键字。
__attribute__((weak))
不是函数类型或存储类的一部分,不需要出现在头文件声明中。它是一个与弱符号有关的GNU C扩展,这是一个链接概念。不必在编译时将符号声明为弱的,并将其声明给使用该符号的地方。只要它是一个外部符号就足够了。当程序链接在一起时,弱点在于面对多个定义时如何解决外部引用的灵活性。
你试图解决的问题不需要弱符号,因为你控制着所有的符号定义,控制着程序如何划分为.o
目标文件,以及哪个目标文件进入哪个可执行文件。在您的代码和构建结构中,您可以安排每个程序与任何foo
或bar
函数的单个定义相链接。
弱符号有助于处理共享库部署和维护中的某些问题。特别是广泛使用的平台库。