Странное поведение float в определении функции. И несоответствие объявления и определения, но оно работает, как?

Как работает следующий код, даже если подпись функции в объявлении не совпадает с определением? Объявление функции имеет пустой список параметров, но определение имеет один параметр. Почему компилятор не выдает ошибку?

#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), но язык настолько загадочный, что я не мог ясно понять. Я даже не знаю, правильно ли я прочитал. Поэтому, пожалуйста, объясните это поведение простыми словами.

5
задан Nawaz 5 June 2011 в 16:13
поделиться