Re[3]: void fun() и void fun(void) разные функции?
От: Андрей Тарасевич Беларусь  
Дата: 17.11.06 18:16
Оценка: 5 (1)
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>В С — объявление функции с '()' — это объявление в "старом" стиле K&R, которое не создает прототипа и ничего не говорит о параметрах


RO>...всё равно, что «void f(...);».


Хм... Я бы так так не сказал. Сразу можно заметить, что чисто синтаксически в С запрещается обявление 'void foo(...)'. Перед '...' обязан присутствовать хотя бы одна явная декларация параметра.

Также, даже если какой-то компилятор пропускает подобное, с семантической точки зрения тип функции с параметрами '()' является совместимым с целым рядом различных типов функций (не буду приводить точного правила), а вот о типе функции с '...' сказать такого нельзя.

Это позволяет в С релизовывать вот такую (пусть и опасную) идиому без выполнения каких-либо явных приведений типов

void foo(void);
void bar(int);
void baz(double);

int main()
{
  void (*p[3])();

  p[0] = foo;  
  p[1] = bar;
  p[2] = baz;

  p[0]();
  p[1](5);
  p[2](10.0);
}


Типы же функций с '...' в парамерах совместимы только с при точном совпадении деклараций параметров

void foo(int, ...);

int main()
{
  void (*p)() = foo; /* ERROR */
}
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.