リンカ・ローダと実行形式
a.cとb.cの両方で、static を付けない同じ名前のグローバル関数 void init(void) を定義してリンクした。起こることとして正しいものはどれか。
- A後からリンクした方が自動で使われ、エラーは出ない
- B同じシンボルが2回定義されているとして、リンクのときにエラーになる
- C2つの関数が自動で1つにまとめられ、両方の処理が順に実行される
答えと解説を見る
正解:B. 同じシンボルが2回定義されているとして、リンクのときにエラーになる
staticを付けないグローバル関数は、プログラム全体で1つの名前を共有します。同じ名前の定義が2つあると、リンカは参照をどちらに結びつければよいか決められないので、多重定義(multiple definition)のエラーになります。ファイルの中だけで使う関数ならstaticを付けて外から見えなくすれば、別のファイルに同じ名前があっても衝突しません。
- A. 通常の(強い)シンボルではどちらかを選ぶことはしません。
- B. 正しい。多重定義のエラーです。
- C. 関数がまとめられることはありません。