我有一系列可执行文件拼凑在一起.o文件。有一些可重用的,然后通常是几个可执行的特定模块。其中一个可重用的部分想要提供一种“应用程序挂钩”。但是许多可执行文件只是执行标准的无操作程序。虽然其他几个人实际上想要为所述钩子定义有趣的行为。
什么是理想的,如果有一种方法可以提供该函数的标准默认版本,如果没有其他.o文件定义所述函数,链接器将使用该函数,但是如果它们执行了,则使用其他函数。
有没有任何方法/技术可以用直接的C来近似这类事情?
答案 0 :(得分:3)
如果您使用GCC作为编译器,那么您可以声明这样的可替换函数:
void foo() __attribute__ ((weak));
以下是有关其工作原理的示例。在main.c文件中:
#include <stdio.h>
void foo()__attribute__ ((weak))
{
printf("%s", "Hidden foo\n");
}
int main()
{
foo();
return 0;
}
在另一个文件中,foo.c:
#include <stdio.h>
void foo()
{
printf("%s", "foo\n");
}
现在当你只编译,链接和运行main.c时,你会得到:
gcc main.c -o main ./main Hidden foo
如果您还编译foo.c,您将获得:
gcc main.c foo.c -o main ./main foo
foo()的弱版本已被替换。
在实际设置中,您可能会使用头文件来提供函数原型:
void foo();
然后实现这些函数的弱版本:
__attribute__ ((weak)) void foo()
{
// ...
}
您还可以使用宏来使其更具可读性:
#define WEAK_SYMBOL __attribute__ ((weak))
这样你就会得到:
WEAK_SYMBOL void foo() { /* ... */ }