c -存根:是否可以使用与__attribute__((weak))相反的东西?



我们假设下面的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目标文件,以及哪个目标文件进入哪个可执行文件。在您的代码和构建结构中,您可以安排每个程序与任何foobar函数的单个定义相链接。

弱符号有助于处理共享库部署和维护中的某些问题。特别是广泛使用的平台库。

相关内容

  • 没有找到相关文章

最新更新