【C++】強引用と弱引用
741 ワード
リンクが強い参照と弱い参照を処理するプロセスはほとんど同じですが、定義されていない弱い参照については、リンクはエラーとは思いません.一般的にデフォルトは0(アドレスは0)または特殊な値で、プログラムコードが認識できるようにします.
GCCはリンクエラーを報告しない実行可能ファイルにコンパイルできます.しかし、プログラムが実行されると、
コードで判断する必要があるのはアドレスであり、値ではないので、変数aの前に
弱いリファレンスと強いリファレンスはプログラムのモジュール化開発に非常に有利で、私たちはプログラムの拡張モジュールを弱いリファレンスとして定義することができて、私たちが拡張モジュールとプログラムをリンクする時、プログラムは正常に使用することができます;いくつかのモジュールを削除すると、プログラムも正常にリンクできますが、いくつかの機能が欠けているだけで、プログラムの機能がより簡単に切り取られ、組み合わせられます.
__attribute__((weak)) extern int a;
printf("a = %d
", a);
GCCはリンクエラーを報告しない実行可能ファイルにコンパイルできます.しかし、プログラムが実行されると、
&a: 0, func: 0
が出力されるとセグメントエラー(Segment Fault)が発生します.これは、シンボルaとfuncのアドレスが0であり、このアドレスはアクセスが禁止されているためです. コードで判断する必要があるのはアドレスであり、値ではないので、変数aの前に
&
を加える必要がある.関数名自体がアドレスを表すのでfuncの前には&
は必要ありません.弱いリファレンスと強いリファレンスはプログラムのモジュール化開発に非常に有利で、私たちはプログラムの拡張モジュールを弱いリファレンスとして定義することができて、私たちが拡張モジュールとプログラムをリンクする時、プログラムは正常に使用することができます;いくつかのモジュールを削除すると、プログラムも正常にリンクできますが、いくつかの機能が欠けているだけで、プログラムの機能がより簡単に切り取られ、組み合わせられます.