10.20 __weak

このキーワードは、コンパイラにシンボルを weak でエクスポートするよう指示します。

__weak キーワードは、関数と変数の宣言、および関数定義に適用できます。

使用法

関数と変数の宣言
宣言の場合、この記憶域クラスは、リンカによって未解決の参照としてエラーが生成されないような extern オブジェクトの宣言を指定します(これには、関数が存在しない場合も含まれます)。
以下に例を示します。
__weak void f(void);
...
f(); // call f weakly
存在しない weak 関数への参照が、分岐または分岐リンク命令にコンパイルされるコードから行われる場合、以下のいずれかが行われます。
  • 参照は次の命令への分岐として解決されます。これにより、この分岐は NOP となります。
  • この分岐は NOP 命令に置き換わります。
関数の定義
__weak で定義された関数は、そのシンボルを weak でエクスポートします。weak で定義された関数は、通常に定義された関数と同様に動作します。ただし、非 weak で定義された同じ名前の関数が同じイメージにリンクされている場合は除きます。非 weak で定義された関数と weak で定義された関数の両方が同じイメージ内に存在する場合、すべての関数呼び出しが非 weak 関数呼び出しとして解決されます。複数の weak 定義がある場合、リンカオプション --muldefweak を使用しない限り、リンカによってエラーメッセージが生成されます。この場合、リンカによって、すべての呼び出しに使用する 1 つの定義が選択されます。
__weak で宣言した後に __weak を使用せずに定義した関数は、非 weak 関数として動作します。

制約条件

__weak を使用して、関数と変数の宣言および関数定義を修飾する場合、制約条件があります。
関数と変数の宣言
関数または変数は、同じコンパイルにおいて weak と非 weak のどちらかとして使用する必要があります。たとえば、以下のコードでは、 g() および h() から f() を weak で使用しています。
void f(void);
void g()
{
    f();
}
__weak void f(void);
void h()
{
    f();
}
関数または変数を定義しているコンパイルで、その関数または変数を weak で使用することはできません。以下のコードでは、h() から非 weak で f() を使用しています。
__weak void f(void);
void h()
{
    f();
}
void f() {}
リンカは、他のコンパイルで関数や変数が非 weak で使用されている場合を除き、ライブラリから関数や変数をロードしません。参照が未解決のままである場合、その値は NULL と見なされます。ただし、コードから位置非依存セクションまたは存在しない __weak 関数への参照が未解決の場合、その未解決の参照は NULL にはなりません。
関数の定義
weak で定義された関数はインライン展開できません。

__weak const int c;                // assume 'c' is not present in final link
const int *f1() { return &c; } // '&c' returns non-NULL if
                                   // compiled and linked /ropi
__weak int i;                      // assume 'i' is not present in final link
int *f2() { return &i; }       // '&i' returns non-NULL if 
                                   // compiled and linked /rwpi
__weak void f(void);               // assume 'f' is not present in final link
typedef void (*FP)(void);
FP g() { return f; }               // 'g' returns non-NULL if 
                                   // compiled and linked /ropi
関連情報
--muldefweak、--no_muldefweak リンカオプション
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.