Кто может объяснить, почему многие пишут f(void) вместо f()? Какой-то из этих вариантов более совместим со старыми компиляторами? В чем преимущества f(void)? Хочу выяснить это раз и навсегда, чтобы выработать какой-то стиль.
ы? ты хотел сказать "традиция Си" и "традиция Си++"? Потому что в Си++ оба варианта допустимы и эквивалентны.
2 OP: f() и f(void) в Си - это просто разные вещи. Прототип f() допускает вызов с любым списком параметров, f(void) - только без параметров. По крайней мере, раньше было так (не знаю, что говорит по этому поводу C99).
> void f() обозначает функцию без параметров, запись f(void) давно устарела.
int f();
int main(void)
{
f(1);
return 0;
}
компилируется без ошибок.
int f(void);
int main(void)
{
f(1);
return 0;
}
не компилируется.
Не объясните ли такое «странное» поведение?
Вообще-то да, объектник удается собрать даже без ворнингов. Непонятно зачем до сих пор поддерживается эта фича. В любом случае такой синтаксис лучше не использовать.
> В каком языке? В Си - устарела как раз форма записи прототипа f().
В стандарте написано:
An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
Во втором случае описывается старый вариант объявления функций, он признан obsolete. Шилдт в своем справочнике пишет о том же, см. гл. "Старомодное объявление функций".
А хотя в главе Future language directions есть такое примечание:
The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.
Вобщем дело запутывается. Если найдешь там место где четко прописано что при отсутствии параметров надо писать void - тебе сенкс. Вобщем-то это даже логичнее: void обозначает и отсутствие возвращаемого значения и парметров.
6.7.5.3.10: The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.
6.7.5.3.14: An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
Там кстати есть интересные примеры, но, в любом случае, в текущем стандарте, int f(); обозначает именно функцию с любым числом параметров. а int f(void); является единственным вариантом указания того, что функция не принимает параметров.