ヘッダー ファイルで既に定義されている関数を .c ファイルで再定義できるようにしたいと考えています。weakref 属性に関する GCC マニュアルによると:
この効果は、エイリアスへのすべての参照を別の翻訳単位に移動し、エイリアスの名前をエイリアス化されたシンボルに変更し、それを弱いものとして宣言し、2 つの別個の翻訳単位をコンパイルし、それらに対して再読み込み可能なリンクを実行することと同じです。
それはまさに私がやりたいことのように聞こえます。ただし、次の例はエラーでコンパイルされません。
tpp.c:18:13: エラー: 'foo' の再定義 tpp.c:6:13: 注: 'foo' の以前の定義はここにありました
#include <sys/types.h>
#include <stdio.h>
/* this will be in a header file */
static void foo(void) __attribute__ ((weakref ("_foo")));
static void _foo(void)
{
printf("default foo\n");
}
/* in a .c file #including the header mentioned above */
#define CUSTOM_FOO
#ifdef CUSTOM_FOO
static void foo(void)
{
printf("user defined foo.\n");
}
#endif
int main(int argc, char **argv)
{
printf("calling foo.\n");
foo();
}
これを正しく使用していますか?私は何が欠けていますか?
gcc バージョン 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)