LINUX.ORG.RU

f(void) vs f()


0

0

Кто может объяснить, почему многие пишут f(void) вместо f()? Какой-то из этих вариантов более совместим со старыми компиляторами? В чем преимущества f(void)? Хочу выяснить это раз и навсегда, чтобы выработать какой-то стиль.

anonymous

Ещё есть третий вариант: void f(void)

ttnl ★★★★★
()
Ответ на: комментарий от klalafuda

> f(void) - это C, f() - это C++.

ну и соотв. естественный вывод: если декларация будет использоваться в сишном коде, то f(void). если это чистый C++ [метод класса к примеру], то f().

// wbr

klalafuda ★☆☆
()

В С f() это функция, которая получает сколько угодно каких угодно параметров, а f(void) это функция, которая получает 0 параметров.

Legioner ★★★★★
()
Ответ на: комментарий от klalafuda

> f(void) - это C, f() - это C++.

ы? ты хотел сказать "традиция Си" и "традиция Си++"? Потому что в Си++ оба варианта допустимы и эквивалентны.

2 OP: f() и f(void) в Си - это просто разные вещи. Прототип f() допускает вызов с любым списком параметров, f(void) - только без параметров. По крайней мере, раньше было так (не знаю, что говорит по этому поводу C99).

tailgunner ★★★★★
()

void f(void)

-- декларация функции (или прототипа), принимающей ноль аргументов

void f()

-- В С: декларация функции (или прототипа), принимающей произвольное, заранее неизвестное кол-во аргументов. В С++ - функция без аргументов.

могу наглючить в деталях.

fmj
()
Ответ на: комментарий от Legioner

+1. f() - В обычном С означает "есть такая функция, но хрен ее знает что там у нее с параметрами"

svu ★★★★★
()
Ответ на: комментарий от anonymous

Путает. f() - это запись из тех времен, когда никакого void в стандарте не было. Архаизм, выживший из-за краткости и удобства.

anonymous
()
Ответ на: комментарий от tailgunner

> В Си прототипы f() и f(...) эквивалентны, просто первый - "старый стиль", второй - "новый".

f(...) это не правильное объявление, должен быть хотя бы один аргумент перед списком параметров.

void f() обозначает функцию без параметров, запись f(void) давно устарела.

shumer
()
Ответ на: комментарий от shumer

> void f() обозначает функцию без параметров, запись f(void) давно устарела.

int f();

int main(void)
{
    f(1);
    return 0;
}

компилируется без ошибок.

int f(void);

int main(void)
{
    f(1);
    return 0;
}

не компилируется.

Не объясните ли такое «странное» поведение?

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

[root:alex tmp]$ cat 2.c
int f() { return 0; }

int main(void)
{
    f(1);

    return 0;
}

[root:alex tmp]$ gcc -o 2 2.c
[root:alex tmp]$ ./2
[root:alex tmp]$ 

alex_custov ★★★★★
()
Ответ на: комментарий от Legioner

> компилируется без ошибок.

Вообще-то да, объектник удается собрать даже без ворнингов. Непонятно зачем до сих пор поддерживается эта фича. В любом случае такой синтаксис лучше не использовать.

shumer
()
Ответ на: комментарий от shumer

> f(...) это не правильное объявление, должен быть хотя бы один аргумент перед списком параметров

Это да, здесь я ошибся. Не успел привыкнуть к ISO C и прочим C99 :/

> void f() обозначает функцию без параметров, запись f(void) давно устарела.

В каком языке? В Си - устарела как раз форма записи прототипа f().

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> В каком языке? В Си - устарела как раз форма записи прототипа 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. Шилдт в своем справочнике пишет о том же, см. гл. "Старомодное объявление функций".

shumer
()
Ответ на: комментарий от shumer

>> В каком языке? В Си - устарела как раз форма записи прототипа f().

>В стандарте написано:

>An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters

В стандарте какого языка? Ссылку можно?

tailgunner ★★★★★
()
Ответ на: комментарий от shumer

А хотя в главе Future language directions есть такое примечание:

The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.

Вобщем дело запутывается. Если найдешь там место где четко прописано что при отсутствии параметров надо писать void - тебе сенкс. Вобщем-то это даже логичнее: void обозначает и отсутствие возвращаемого значения и парметров.

shumer
()
Ответ на: комментарий от shumer

Если что, я использовал comeau online, один из самых стандартных компиляторов.

http://anatolix.naumen.ru/Books/Standard?v=z8h — стандарт C99

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); является единственным вариантом указания того, что функция не принимает параметров.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.