我有一系列从一组 .o 文件拼凑而成的可执行文件。有一些可重用的,然后通常是几个可执行的特定模块。其中一个可重用的部分想要提供一种“应用程序挂钩”。但是许多可执行文件只是做一个标准的无操作的事情。而其他几个人实际上想为所说的钩子定义有趣的行为。
理想的情况是,如果有一种方法可以提供函数的标准默认版本,如果没有其他 .o 文件定义所述函数,则链接器将使用该函数,但如果有,则使用其他函数。
有什么方法/技术可以用直接的 C 来近似这种事情吗?
我有一系列从一组 .o 文件拼凑而成的可执行文件。有一些可重用的,然后通常是几个可执行的特定模块。其中一个可重用的部分想要提供一种“应用程序挂钩”。但是许多可执行文件只是做一个标准的无操作的事情。而其他几个人实际上想为所说的钩子定义有趣的行为。
理想的情况是,如果有一种方法可以提供函数的标准默认版本,如果没有其他 .o 文件定义所述函数,则链接器将使用该函数,但如果有,则使用其他函数。
有什么方法/技术可以用直接的 C 来近似这种事情吗?
如果您使用 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 主 。/主要的 隐藏的 foo
如果你也编译 foo.c,你会得到:
gcc main.c foo.c -o main 。/主要的 富
foo() 的弱版本已被替换。
在实际设置中,您可能会使用头文件来提供函数原型:
void foo();
然后像这样实现这些函数的弱版本:
__attribute__ ((weak)) void foo()
{
// ...
}
您还可以使用宏使其更具可读性:
#define WEAK_SYMBOL __attribute__ ((weak))
这样你会得到:
WEAK_SYMBOL void foo() { /* ... */ }