链接的默认函数实现

时间:2013-02-07 16:37:07

标签: c

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

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

有没有任何方法/技术可以用直接的C来近似这类事情?

1 个答案:

答案 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() { /* ... */ }