コンパイラとして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() { /* ... */ }