Что означают круглые скобки вокруг имени функции?

В одном из моих исходных файлов проекта я нашел это определение функции 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

Скобки не имеют смысла.
Код, который вы показываете, представляет собой не что иное, как бесконечную рекурсию.

При определении указателя на функцию вы иногда видите странные скобки, которые что-то означают. Но здесь это не так.