DOSEIの日記

技術メモ+日常ログ

実験用のプログラムがなぜかちゃんとコンパイルできない理由がわかった。
モジュールに分けたプログラムで、エラーとしてはリンカが「そんな関数ねーっス」とか言っているわけで、引数とかの型はあってるのに何でだろうと悩んでいたら、ヘッダに書いてあるプロトタイプが間違っていて、別の関数だと思っていたようだ。
C++は同じ関数名でも引数のパターンによって別の関数として振舞う(オーバーロード。オーバーライドではないので注意*1。擬似polymorphism)。ていうか、

  • 本来の関数はプロトタイプがないが使われてないからコンパイルエラーが出ない
  • 間違ったプロトタイプの実体はないが別にエラーにはならない
  • 呼び出し元では合致するプロトタイプが1つしかないので、暗黙の変換が起きる
  • リンカはコマッチング

という流れだったようだ。C++のプロトタイプを強制する仕様とか、意味ないじゃん。とか思った。

*1:オーバーライトでもない