А>Раньше с таким никогда не сталкивался. Думал что () это (void) по умолчанию. А>Оказывается не так.
А>А какой по умолчанию ()?
Разница в используемом языке.
На языке С это разные функции:
1) void f() — функция может принимать несколько параметров (типа printf)
2) void f(void) — функция не принимает ни одного параметра.
На языке С++ оба варианта не принимают ниодного параметра.
Re[2]: void fun() и void fun(void) разные функции?
От:
Аноним
Дата:
17.11.06 11:54
Оценка:
А>>Раньше с таким никогда не сталкивался. Думал что () это (void) по умолчанию. А>>Оказывается не так.
А>>А какой по умолчанию ()?
N>Разница в используемом языке. N>На языке С это разные функции: N>1) void f() — функция может принимать несколько параметров (типа printf) N>2) void f(void) — функция не принимает ни одного параметра. N>На языке С++ оба варианта не принимают ниодного параметра.
А шутки ради если взять за метод класса и вспомнить что this передаётся неявно в каждый метод то должны быть разными
Здравствуйте, Аноним, Вы писали:
А>Раньше с таким никогда не сталкивался. Думал что () это (void) по умолчанию. А>Оказывается не так. А>А какой по умолчанию ()?
В каком языке?
В C++ объявление функции с '()' и с '(void)' — одно и то же.
В С — объявление функции с '()' — это объявление в "старом" стиле K&R, которое не создает прототипа и ничего не говорит о параметрах, в то время как объявление с '(void)'- это объявление с прототипом, которое говорит, что параметров нет.
Best regards,
Андрей Тарасевич
Re[2]: void fun() и void fun(void) разные функции?
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>В С — объявление функции с '()' — это объявление в "старом" стиле K&R, которое не создает прототипа и ничего не говорит о параметрах
...всё равно, что «void f(...);».
До последнего не верил в пирамиду Лебедева.
Re[3]: void fun() и void fun(void) разные функции?
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>В С — объявление функции с '()' — это объявление в "старом" стиле K&R, которое не создает прототипа и ничего не говорит о параметрах
RO>...всё равно, что «void f(...);».
Хм... Я бы так так не сказал. Сразу можно заметить, что чисто синтаксически в С запрещается обявление 'void foo(...)'. Перед '...' обязан присутствовать хотя бы одна явная декларация параметра.
Также, даже если какой-то компилятор пропускает подобное, с семантической точки зрения тип функции с параметрами '()' является совместимым с целым рядом различных типов функций (не буду приводить точного правила), а вот о типе функции с '...' сказать такого нельзя.
Это позволяет в С релизовывать вот такую (пусть и опасную) идиому без выполнения каких-либо явных приведений типов
Здравствуйте, ncode, Вы писали:
N>На языке С это разные функции: N>1) void f() — функция может принимать несколько параметров (типа printf) N>2) void f(void) — функция не принимает ни одного параметра.
Аналогия 'f()' с 'printf' — плохая. 'printf' — вариадическая функция (т.е. функция, объявленная с '...' в списке параметров), в то время как 'f' — функция обычная, о параметрах котрой ничего не говорится. Это принипиально различные и соврешенно не совместимые друг с другом типы функций.
В частности, вариадические функции всегда требуют как минимум один аргумент, в то время как 'f' может вообще никаких аргументов не принимать.
Best regards,
Андрей Тарасевич
Re[3]: void fun() и void fun(void) разные функции?
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>В частности, вариадические функции всегда требуют как минимум один аргумент
А разве я не могу написать так:
void f(...)
{
f();
}
?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: void fun() и void fun(void) разные функции?
Здравствуйте, Андрей Тарасевич, Вы писали:
E>>А разве я не могу написать так:
E>>void f(...)
E>>{
E>> f();
E>>}
E>>
?
АТ>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.
Это в С или в С++ так?
Если в С++, то прикольно было бы узнать где про это написано.
А в С вроде действительно так
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: void fun() и void fun(void) разные функции?
Здравствуйте, Erop, Вы писали:
E>>>А разве я не могу написать так:
E>>>void f(...)
E>>>{
E>>> f();
E>>>}
E>>>
?
АТ>>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.
E>Это в С или в С++ так? E>Если в С++, то прикольно было бы узнать где про это написано.
Хм... Да в С++ про это нигде не написано. Т.е. разрешается. Зачем — не понятно. Может просто "так получилось" из-за того, что запятую перед '...' разрешили не указывать. А может что-то за этим и скрывается. (Я, честно говоря, не знаю, зачем запятую разрешили не указывать...)
Best regards,
Андрей Тарасевич
Re[7]: void fun() и void fun(void) разные функции?
Здравствуйте, Андрей Тарасевич, Вы писали:
E>>>>А разве я не могу написать так:
E>>>>void f(...)
E>>>>{
E>>>> f();
E>>>>}
E>>>>
?
АТ>>>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.
E>>Это в С или в С++ так? E>>Если в С++, то прикольно было бы узнать где про это написано.
АТ>Хм... Да в С++ про это нигде не написано. Т.е. разрешается. Зачем — не понятно. Может просто "так получилось" из-за того, что запятую перед '...' разрешили не указывать. А может что-то за этим и скрывается. (Я, честно говоря, не знаю, зачем запятую разрешили не указывать...)
может из-за SFINAE?
Re[8]: void fun() и void fun(void) разные функции?
Здравствуйте, night beast, Вы писали:
АТ>>>>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.
E>>>Это в С или в С++ так? E>>>Если в С++, то прикольно было бы узнать где про это написано.
АТ>>Хм... Да в С++ про это нигде не написано. Т.е. разрешается. Зачем — не понятно. Может просто "так получилось" из-за того, что запятую перед '...' разрешили не указывать. А может что-то за этим и скрывается. (Я, честно говоря, не знаю, зачем запятую разрешили не указывать...)
NB>может из-за SFINAE?
'...' в С++ появился так давно, что о шаблонном метапрограммировании (и тем более о SFINAE) никто еще даже и не задумывался. Причем, что интересно, '...' появился именно в С++ (в той еще сырой форме, в которой он существовал тогда), а уже оттуда был позаимствован в С. Соответственно неудивительно, что С-вариант может оказаться более "проработанным", если дело тут просто в "проработанности"...
Хоят может быть дело все-таки в чем-то специфичном для С++. Может существование неявного параметра 'this' в методах классов сыграло свою роль. Может еще что-то.