2

一連の.oファイルから実行可能ファイルのファミリーをつなぎ合わせています。再利用可能なものがいくつかあり、通常は実行可能な特定のモジュールがいくつかあります。再利用可能な部分の1つは、一種の「アプリケーションフック」を提供したいと考えています。しかし、実行可能ファイルの多くは、標準的な操作なしのことを実行するだけです。他のいくつかは実際にそのフックの興味深い振る舞いを定義したいと思っています。

理想的なのは、関数の標準のデフォルトバージョンを提供する方法がある場合です。これは、他の.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 main
。/主要
隠されたfoo

代わりにfoo.cもコンパイルすると、次のようになります。

gcc main.c foo.c -o main
。/主要
foo

foo()の弱いバージョンが置き換えられました。

実際のセットアップでは、おそらくヘッダーファイルを使用して関数プロトタイプを提供します。

void foo();

次に、これらの関数の弱いバージョンを次のように実装します。

__attribute__ ((weak)) void foo()
{
    // ...
}

マクロを使用して、これをもう少し読みやすくすることもできます。

#define WEAK_SYMBOL __attribute__ ((weak))

あなたが得るように:

WEAK_SYMBOL void foo() { /* ... */ }
于 2013-02-07T16:47:36.403 に答える