Что означают круглые скобки вокруг имени функции?
В одном из моих исходных файлов проекта я нашел это определение функции C:
int (foo) (int *bar)
{
return foo (bar);
}
Примечание. Звездочка рядом с foo
отсутствует, поэтому она не является указателем на функцию. Или это?
Что происходит здесь с помощью рекурсивного вызова?
Ответы
Ответ 1
При отсутствии какого-либо материала препроцессора подпись foo
эквивалентна
int foo (int *bar)
Единственный контекст, в котором я видел людей, помещающих, казалось бы, лишние круглые скобки вокруг имен функций, - это когда есть как функция, так и функционально подобный макрос с тем же именем, и программист хочет предотвратить расширение макроса.
Эта практика может показаться немного странной, но библиотека C устанавливает прецедент предоставляя некоторые макросы и функции с идентичными именами.
Одна такая пара функций/макросов isdigit()
. Библиотека может определить его следующим образом:
/* the macro */
#define isdigit(c) ...
/* the function */
int (isdigit)(int c) /* avoid the macro through the use of parentheses */
{
return isdigit(c); /* use the macro */
}
Ваша функция выглядит почти идентично выше, поэтому я подозреваю, что это тоже происходит в вашем коде.
Ответ 2
Скобки не изменяют объявление - он все еще просто определяет обычную функцию под названием foo
.
Причина, по которой они были использованы, почти наверняка объясняется тем, что существует макрос функции, называемый foo
:
#define foo(x) ...
Использование (foo)
в объявлении функции предотвращает расширение этого макроса. Так что, вероятно, происходит то, что функция foo()
определяется с расширением ее тела из макрополя типа foo
.
Ответ 3
Скобки не имеют смысла.
Код, который вы показываете, представляет собой не что иное, как бесконечную рекурсию.
При определении указателя на функцию вы иногда видите странные скобки, которые что-то означают. Но здесь это не так.