Wikipedia によれば:
弱いシンボルは、実行可能およびリンク可能形式 (ELF) のオブジェクト ファイルのリンク中に特別に注釈が付けられたシンボルを示します。デフォルトでは、注釈がない場合、オブジェクト ファイル内のシンボルは強いシンボルです。リンク中、強いシンボルは同じ名前の弱いシンボルをオーバーライドできます。対照的に、名前を共有する 2 つの強いシンボルは、リンク時にリンク エラーを生成します。バイナリ実行可能ファイルをリンクする場合、弱く宣言されたシンボルには定義は必要ありません。比較すると、(デフォルトでは) 定義のない強いシンボルを宣言すると、未定義シンボルのリンク エラーが発生します。弱いシンボルは、C または C++ 言語標準では言及されていないため、コードに挿入しても移植性はあまりありません。2 つのプラットフォームがシンボルを弱いとマークするための同じまたは類似の構文をサポートしている場合でも、微妙な点でセマンティクスが異なることがあります。たとえば、実行時の動的リンク中の弱いシンボルがセマンティクスを失うかどうかなどです。
弱い関数とは何ですか? また、それらの用途は何ですか? 私は stm32f429 マイクロ コントローラーを使用しています。 ライブラリには弱い関数がいくつかあります。 しかし、それらが何で、どのように使用されるのか理解できません。
Googleで調べてみましたが、満足のいく答えは得られませんでした。
ベストアンサー1
関数の先頭に記述子 __weak が付加されている場合、基本的には、(コーダーが) 関数を定義しない場合はここで定義されることを意味します。
私の最大のライバルである「HAL_UART_RxCpltCallback()」を見てみましょう。
この関数は、ST-Micro からダウンロードできる STM32F4-HAL コード ベースの HAL 内に存在します。
stm32f4xx_hal_uart.c ファイル内では、この関数は次のように定義されています。
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
したがって、このコード内の注記にあるように、この関数を独自のユーザー ファイル内に配置します。ただし、その場合、用語は入れないでください__weak
。つまり、リンカーは、stm32f4xx_hal_uart.c ファイル内で定義されたものではなく、HAL_UART_RxCpltCallback() 関数の定義を取得します。
これにより、汎用コード ベースは常にコンパイルできるようになります。興味のない関数を大量に記述する必要はありませんが、コンパイルされます。独自の関数を記述するときは、関数を として定義せずに記述するだけです__weak
。
シンプルですか? 役に立ちますか?
乾杯!!