関数プロトタイプの混乱②
前回のエントリ関数プロトタイプの混乱①では前方宣言なしのパターンを扱いました。今回は関数宣言、プロトタイプ宣言有りの場合について考えていきたいと思います。
Pattern 4
double func(); int main(){ func(3); } double func( int i_a ){ printf("i_a=%d\n",i_a); return(0); }
Pattern 4はCではコンパイルできますがC++だとエラーとなります。Cの場合この前方宣言はプロトタイプ宣言ではなく関数宣言といいます。関数宣言は
①関数の名前
②戻り値の型
をコンパイラに知らせます。引数は不定ながら戻り値がdoubleという事を明示しています。これがC++だと関数宣言ではなくプロトタイプ宣言として扱われます。引数を省略した場合はvoidとして扱うため、実体と宣言で引数の型が合わず、実態がないというエラーになります。という事は続いてはどうでしょうか?
Pattern 5
double func(); int main(){ func(); } double func(void){ printf("i_a=%d\n",3); return(0); }
Pattern 5はCでもC++でもまったく正しいソースとなります。Cでは関数宣言の型と一致しており、C++ではプロトタイプ宣言と一致しています。 この関数宣言とプロトタイプ宣言という仕様の違いが混乱を招く一端となっていると思います。このあたりはプロトタイプ宣言を当たり前のようにやっていると気づかないかもしれません。
今回は関数宣言について見てみました。次回はC++で追加されたデフォルト引数についての注意点を見てみたいと思います。