C言語には「プロトタイプ宣言」という機能があります。
これはコンパイラーに
- 関数の戻り値
- 関数の引数の数と型
をあらかじめ教えることによって、呼出元と実際の関数のエントリポイントでの不整合をなくし、予期せぬ不具合を生ませないためのチェック機能です。
C言語のプロトタイプ宣言を使い方
プロトタイプ宣言は一般的にはインクルードヘッダーに定義しそれを読み込んだり、ソースファイルの上部で定義されます。
C言語のプロトタイプ宣言
実際にプロトタイプ宣言を見ていきます。
#include <stdio.h> #include <string.h> #include <stdarg.h> //Prototype Start void debugPrint( char*, int , char*) ; int main( int , char ** ) ; //Prototype End int main( int argc, char **argv ) { } void debugPrint( char*, int , char*) ; { }
のように宣言します。
プロトタイプ宣言は
関数の戻り値 関数名(引数の型,引数の型,引数の型);
という書式です。
(変数名を書いてもエラーにはなりませんが、変数名が変わった時などに修正するのも面倒なので書かない方が一般的です。)
プロトタイプ宣言がない時
プロトタイプ宣言がない時場合は以下のよう警告が出ますが、実行モジュールは作成されます。
conflicting types for 'debugPrint' main.c /ctest 行 19
これは実際は「void型の戻り値(なにも値を返さない)」の関数なのに、プロトタイプ宣言がないので「int型の値を返す関数」とみなされ、「型が衝突していますよ」という警告です。
C言語では省略された宣言は「int型」として扱います。
プロトタイプ宣言と実際の関数の宣言が異なる場合
プロトタイプ宣言と実際の関数の宣言が異なる場合はコンパイル時点でエラーになります。
Info: Internal Builder is used for build gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..main.c" ..main.c:19:6: error: conflicting types for 'debugPrint' void debugPrint(int aaa,char *fname, int line, char *fmt, ...) ^~~~~~~~~~ ..main.c:9:6: note: previous declaration of 'debugPrint' was here void debugPrint( char*, int , char*, ... ) ; ^~~~~~~~~~ 15:36:58 ビルドに失敗しました。1 errors, 0 warnings. (経過 766ms)
まとめ
C言語のプロトタイプ宣言はプログラムを実行する前に呼出元と呼び先での戻り値の型や引数の型や数の違いをチェックしてくれるので、想定外の不具合を事前に回避できる便利な機能です。
以上、C言語のプロトタイプ宣言を使い方でした。