__weak

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

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

Show/hide使用法

関数と変数の宣言

宣言の場合、この記憶域クラスは、リンカによって未解決の参照としてエラーが生成されないような extern オブジェクトの宣言を指定します(これには、関数が存在しない場合も含まれます)。

以下に例を示します。

__weak void f(void);
...
f(); // f を weak で呼び出す

存在しない weak 関数への参照が、分岐または分岐リンク命令にコンパイルされるコードから行われる場合、以下のいずれかが行われます。

  • 参照は次の命令への分岐として解決されます。これにより、この分岐は NOP となります。

  • この分岐は NOP 命令に置き換わります。

関数の定義

__weak で定義された関数は、そのシンボルを weak でエクスポートします。weak で定義された関数は、通常に定義された関数と同様に動作します。ただし非 weak で定義された同じ名前の関数が同じイメージにリンクされている場合は除きます。非 weak で定義された関数と weak で定義された関数の両が同じイメージ内に存在する場合、すべての関数呼び出しが非 weak 関数呼び出しとして解決されます。複数の weak の定義がある場合、リンカによって、すべての呼び出しに使用する 1 つの定義が選択されます。

__weak で宣言した後に __weak を使用せずに定義した関数は、非 weak 関数として動作します。

Show/hide制約条件

__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 で定義された関数はインライン展開できません。

Show/hide

 __weak const int c;            // 'c' は最終的なリンクに存在しないものとする
 const int *f1() { return &c; } // '&c' は NULL 以外を返す
                                // (/ropi でコンパイルとリンクを行った場合)
 __weak int i;                  // 'i' は最終的なリンクに存在しないものとする
 int *f2() { return &i; }       // '&i' は NULL 以外を返す
                                // (/rwpi でコンパイルとリンクを行った場合)
 __weak void f(void);           // 'f' は最終的なリンクに存在しないものとする
 typedef void (*FP)(void);
 FP g() { return f; }           // 'g' は NULL 以外を返す
                                // (/ropi でコンパイルとリンクを行った場合)

Show/hide関連項目

  • ライブラリ検索の詳細については、『armar での静的ソフトウェアライブラリの作成』を参照して下さい。

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0491EJ
Non-ConfidentialID081711