#pragma weak function-name1 [=function-name2]
function-name1 は関数名を、function-name2 は複数の関数を指定する場合の 2 つ目の関数名を示します。
weak を使用すると、弱い (weak) 大域シンボルを定義できます。このプラグマは主にソースファイルの中でライブラリを構築するために使用されます。リンカーは弱いシンボルを認識できなくてもエラーメッセージを出しません。
次の指令は、bar を弱いシンボルとして定義しています。リンカーが bar という関数の定義を見つけられなくても、エラーメッセージは生成されません。
#pragma weak bar
次の指令は、プログラム内の任意の位置に bar が定義されている場合は bar に対するすべての参照を解決し、bar が定義されていない場合は foo に対するすべての参照を解決するようにリンカーに指示します。
#pragma weak bar = foo
weak プラグマ内で関数を使用するには、使用前にその関数の宣言を行う必要があります。次に例を示します。
extern void bar(int) extern void _bar(int) #pragma weak _bar=bar
#pragma weak を使用する場合の効果は次のとおりです。
プログラムで function_name1 を呼び出すだけで定義していない場合、リンカーはライブラリ中の定義を使用します。
プログラムで独自の function_name1 を定義している場合は、プログラム中の定義が使用されるため、ライブラリの中にある function_name1 の弱い大域定義は使用されません。
プログラムが直接 function_name2 を呼び出す場合は、ライブラリ中の定義が使用され、 function_name2 を重複定義するとエラーになります。
詳細は、Solaris のマニュアル『リンカーとライブラリ』を参照してください。
プラグマ内の名前は、リンカーが認識できるものでなければなりません。つまり、関数に C++ リンケージがある場合には「符号化された」名前でなければなりません。