宣言内の関数の署名が定義と一致しない場合でも、次のコードはどのように機能しますか? 関数宣言には空のパラメーター リストがありますが、定義には 1 つのパラメーターがあります。コンパイラがエラーを出さないのはなぜですか?
#include <stdio.h>
double f(); //function declaration
int main(void)
{
printf("%f\n", f(100.0));
}
double f(double param) //function definition
{
return 5 * param ;
}
正常にコンパイルおよび実行されます ( ideone )。
しかし、定義内のパラメーターの型double
を からに変更するfloat
と、次のエラー ( ideone )が発生します。
prog.c:7: エラー: 'f' の型が競合しています<br> prog.c:8: 注: デフォルトの昇格を持つ引数の型は、空のパラメーター名リスト宣言と一致できません
prog.c:2: エラー: 'f' の前の宣言はここにありました
の何が問題になっていfloat
ますか? float
でエラーが発生するのにエラーが発生するのはなぜdouble
ですか?
以下は、宣言と定義のペアのリストと、機能するペアと機能しないペアです。
作品(イデオネ)
double f(); //declaration double f(double param); //definition
動作しません (イデオン)
double f(); //declaration double f(float param); //definition
作品(イデオネ)
float f(); //declaration float f(double param); //definition
動作しません (イデオン)
float f(); //declaration float f(float param); //definition
パラメータタイプfloat
が
だから私は基本的に2つの質問があります:
- 宣言と定義に不一致があるにもかかわらず、最初の例が機能するのはなぜですか?
- parameter-type が の場合に機能しないのはなぜ
float
ですか?
セクション 6.5.2.2 (C99) を理解しようとしましたが、言語が非常に不可解で、明確に理解できませんでした。正しいセクションを読んだかどうかさえわかりません。ですから、これらの行動を簡単な言葉で説明してください。