Как работает следующий код, даже если подпись функции в объявлении не совпадает с определением? Объявление функции имеет пустой список параметров, но определение имеет один параметр. Почему компилятор не выдает ошибку?
#include
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: error: конфликтующие типы для 'f'
prog.c: 8: примечание: тип аргумента с продвижением по умолчанию не может соответствовать объявлению списка имен пустых параметров
prog.c: 2: error: здесь было предыдущее объявление «f»
Что не так с float
? Почему выдает ошибку с float
, но не с double
?
Вот список пар объявления и определения, а также какая пара работает, а какая нет:
Работает ( ideone )
double f (); // объявление
двойной f (двойной параметр); //определение
Не работает ( ideone )
double f (); // объявление
double f (параметр с плавающей запятой); //определение
Работает ( ideone )
float f (); // объявление
float f (двойной параметр); //определение
Не работает ( ideone )
float f (); // объявление
float f (параметр float); //определение
Кажется, что всякий раз, когда тип параметра - float
, это не работает!
У меня в основном два вопроса:
float
? Я пытался разобраться в разделе §6.5.2.2 (C99), но язык настолько загадочный, что я не мог ясно понять. Я даже не знаю, правильно ли я прочитал. Поэтому, пожалуйста, объясните это поведение простыми словами.