関数は、宣言されるよりも前に使われると、 すべて int foo(int) ; という型をもつとして扱われます。 (どんな呼び出しかたをされていても)
int main(void) {
:
x = foo(y) ; // ここで始めて出てきたので、int foo(int) ;
: // だとみなされる。
:
cp = poo() ; // int poo(int) ; とみなされるので、引数
: // がないために warningがでる。
return 0 ;
}
char* poo(void) { // ここまで来たところで、 同じ名前で違う
: // 型の関数を定義していることになり、2重
: // 定義エラーとなる。
}
これを避けるためにはどうしたらよいでしょうか?
次のような解決法が考えられます。
関数は定義してから使う (PASCAL 式)
char* poo(void) { // 関数本体
:
}
int main(void) {
:
cp = poo() ; // 使用
:
return 0 ;
}
始めにプロトタイプ宣言をしておく
char* poo(void) ; // プロトタイプ宣言
int main(void) {
:
cp = poo() ; // 使用
:
return 0 ;
}
char* poo(void) { // 関数本体
:
}
個人的には (1)の方が好きですが、 上の例の場合、 main() と poo() が別ファイルになっているとしたら、 プロトタイプ宣言は必須です。