Здравствуйте, 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 */
}