void fun() и void fun(void) разные функции?
От: Аноним  
Дата: 17.11.06 11:41
Оценка:
Раньше с таким никогда не сталкивался. Думал что () это (void) по умолчанию.
Оказывается не так.

А какой по умолчанию ()?
Re: void fun() и void fun(void) разные функции?
От: ncode  
Дата: 17.11.06 11:49
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Раньше с таким никогда не сталкивался. Думал что () это (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 fun() и void fun(void) разные функции?
От: Андрей Тарасевич Беларусь  
Дата: 17.11.06 15:24
Оценка: +1
#Имя: FAQ.cpp.fun(void)
Здравствуйте, Аноним, Вы писали:

А>Раньше с таким никогда не сталкивался. Думал что () это (void) по умолчанию.

А>Оказывается не так.
А>А какой по умолчанию ()?

В каком языке?

В C++ объявление функции с '()' и с '(void)' — одно и то же.

В С — объявление функции с '()' — это объявление в "старом" стиле K&R, которое не создает прототипа и ничего не говорит о параметрах, в то время как объявление с '(void)'- это объявление с прототипом, которое говорит, что параметров нет.
Best regards,
Андрей Тарасевич
Re[2]: void fun() и void fun(void) разные функции?
От: Roman Odaisky Украина  
Дата: 17.11.06 17:56
Оценка: -1
Здравствуйте, Андрей Тарасевич, Вы писали:

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


...всё равно, что «void f(...);».
До последнего не верил в пирамиду Лебедева.
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,
Андрей Тарасевич
Re[2]: void fun() и void fun(void) разные функции?
От: Андрей Тарасевич Беларусь  
Дата: 17.11.06 18:20
Оценка:
Здравствуйте, 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) разные функции?
От: Erop Россия  
Дата: 18.11.06 08:13
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>В частности, вариадические функции всегда требуют как минимум один аргумент


А разве я не могу написать так:
void f(...) 
{
    f();
}
?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: void fun() и void fun(void) разные функции?
От: Андрей Тарасевич Беларусь  
Дата: 18.11.06 08:37
Оценка:
Здравствуйте, Erop, Вы писали:

АТ>>В частности, вариадические функции всегда требуют как минимум один аргумент


E>А разве я не могу написать так:
E>void f(...) 
E>{
E>    f();
E>}
E>
?


Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.
Best regards,
Андрей Тарасевич
Re[5]: void fun() и void fun(void) разные функции?
От: Erop Россия  
Дата: 18.11.06 09:12
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

E>>А разве я не могу написать так:
E>>void f(...) 
E>>{
E>>    f();
E>>}
E>>
?


АТ>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.


Это в С или в С++ так?
Если в С++, то прикольно было бы узнать где про это написано.
А в С вроде действительно так
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: void fun() и void fun(void) разные функции?
От: Андрей Тарасевич Беларусь  
Дата: 18.11.06 09:23
Оценка:
Здравствуйте, Erop, Вы писали:

E>>>А разве я не могу написать так:
E>>>void f(...) 
E>>>{
E>>>    f();
E>>>}
E>>>
?


АТ>>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.


E>Это в С или в С++ так?

E>Если в С++, то прикольно было бы узнать где про это написано.

Хм... Да в С++ про это нигде не написано. Т.е. разрешается. Зачем — не понятно. Может просто "так получилось" из-за того, что запятую перед '...' разрешили не указывать. А может что-то за этим и скрывается. (Я, честно говоря, не знаю, зачем запятую разрешили не указывать...)
Best regards,
Андрей Тарасевич
Re[7]: void fun() и void fun(void) разные функции?
От: night beast СССР  
Дата: 18.11.06 14:27
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

E>>>>А разве я не могу написать так:
E>>>>void f(...) 
E>>>>{
E>>>>    f();
E>>>>}
E>>>>
?


АТ>>>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.


E>>Это в С или в С++ так?

E>>Если в С++, то прикольно было бы узнать где про это написано.

АТ>Хм... Да в С++ про это нигде не написано. Т.е. разрешается. Зачем — не понятно. Может просто "так получилось" из-за того, что запятую перед '...' разрешили не указывать. А может что-то за этим и скрывается. (Я, честно говоря, не знаю, зачем запятую разрешили не указывать...)


может из-за SFINAE?
Re[8]: void fun() и void fun(void) разные функции?
От: Андрей Тарасевич Беларусь  
Дата: 20.11.06 04:45
Оценка:
Здравствуйте, night beast, Вы писали:

АТ>>>>Формально — нет. Объявление с '(...)' отсекается еще на уровне грамматики языка.


E>>>Это в С или в С++ так?

E>>>Если в С++, то прикольно было бы узнать где про это написано.

АТ>>Хм... Да в С++ про это нигде не написано. Т.е. разрешается. Зачем — не понятно. Может просто "так получилось" из-за того, что запятую перед '...' разрешили не указывать. А может что-то за этим и скрывается. (Я, честно говоря, не знаю, зачем запятую разрешили не указывать...)


NB>может из-за SFINAE?


'...' в С++ появился так давно, что о шаблонном метапрограммировании (и тем более о SFINAE) никто еще даже и не задумывался. Причем, что интересно, '...' появился именно в С++ (в той еще сырой форме, в которой он существовал тогда), а уже оттуда был позаимствован в С. Соответственно неудивительно, что С-вариант может оказаться более "проработанным", если дело тут просто в "проработанности"...

Хоят может быть дело все-таки в чем-то специфичном для С++. Может существование неявного параметра 'this' в методах классов сыграло свою роль. Может еще что-то.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.