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