|
もともと C ってとても古くからある言語で、最近のコンパイラも昔のソースコードをそのまま使えるよう 後方互換性重視で実装されているものがほとんどだ。
C では、関数 int func(int, int); も void func(void); も、最終的な機械語では _func という名前になる (関数名の先頭にアンダースコア1個を追加する) ような実装になっている(ものがほとんど:いまさら変えられない)。 # C++ は別。
なので機械語レベルでは int func(int, int) も void func(void) も区別つかなくて、 「リンクできてしまう」(呼び出した結果は正しくない)のが、まあ普通。
関数原型宣言が無いとき int func() /* 引数個数不定 */ とみなされるのは言語仕様で決まっている。 これが実際には void func() /* この書き方は古いので非推奨 */ であるとき - 要求された機械語上での名前は同じだからリンクはできる。 - 呼び出し側は返却値があるつもりでいるが、呼ばれた側は返却値を返却していないので、実行すると誤動作する だけのこと。
int x=func(); としたら x に何が格納されるか不明、つまり誤動作ってことだ。
|