2

我有一系列从一组 .o 文件拼凑而成的可执行文件。有一些可重用的,然后通常是几个可执行的特定模块。其中一个可重用的部分想要提供一种“应用程序挂钩”。但是许多可执行文件只是做一个标准的无操作的事情。而其他几个人实际上想为所说的钩子定义有趣的行为。

理想的情况是,如果有一种方法可以提供函数的标准默认版本,如果没有其他 .o 文件定义所述函数,则链接器将使用该函数,但如果有,则使用其他函数。

有什么方法/技术可以用直接的 C 来近似这种事情吗?

4

1 回答 1

4

如果您使用 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() { /* ... */ }
于 2013-02-07T16:47:36.403 回答