リンカ・ローダと実行形式
C++のコンパイラが関数名に引数の型などの情報を付け加えてシンボル名を作る「名前修飾(マングリング)」の主な目的はどれか。
- A関数名を読めなくして、プログラムを盗まれないようにする
- B関数名を短くして、実行ファイルを小さくする
- C同じ名前で引数の型が違う関数(オーバーロード)や名前空間を、リンカが区別できるようにする
答えと解説を見る
正解:C. 同じ名前で引数の型が違う関数(オーバーロード)や名前空間を、リンカが区別できるようにする
リンカはシンボルを名前の文字列だけで照合します。C++では「print(int)」と「print(double)」のように同じ名前の関数を作れるので、そのままでは区別できません。そこでコンパイラは「_Z5printi」のように引数の型などを名前に埋め込みます。C言語の関数は修飾されないので、C++からCの関数を呼ぶときは「extern "C"」を付けて修飾をやめさせます。
- A. 保護のためのものではありません。
- B. むしろ名前は長くなります。
- C. 正しい。リンカは名前だけで照合するからです。