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

195

В одном из моих исходных файлов проекта я нашел это определение функции C:

int (foo) (int *bar)
{
    return foo (bar);
}

Примечание. Звездочка рядом с foo отсутствует, поэтому она не является указателем на функцию. Или это? Что происходит здесь с помощью рекурсивного вызова?

  • 7
    Нет, это не указатель на функцию - это обычная функция с именем foo.
  • 0
    Это полная функция?
Показать ещё 4 комментария
Теги:
function
parentheses

3 ответа

321
Лучший ответ

При отсутствии какого-либо материала препроцессора подпись 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
    Это может иметь место и здесь; Я не искал макросы ... И я не знал, что расширение макросов не происходит в скобках, спасибо за указание на это!
  • 13
    @ user1859094: На второй взгляд, это почти наверняка то, что происходит в вашем коде. foo(bar) внутри функции использует соответствующий макрос.
Показать ещё 6 комментариев
34

Скобки не изменяют объявление - он все еще просто определяет обычную функцию под названием foo.

Причина, по которой они были использованы, почти наверняка объясняется тем, что существует макрос функции, называемый foo:

#define foo(x) ...

Использование (foo) в объявлении функции предотвращает расширение этого макроса. Так что, вероятно, происходит то, что функция foo() определяется с расширением ее тела из макрополя типа foo.

  • 5
    Хороший вывод (хотя использование скобок для этой цели должно преследоваться по закону).
  • 3
    @ugoren: использование скобок вокруг имени функции - единственный способ предотвратить расширение макроса для макроса, подобного функции. Иногда это необходимый инструмент.
Показать ещё 1 комментарий
0

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

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

  • 6
    Очевидно, нет; скобки предотвращают расширение макроса. Смотрите принятый ответ.
  • 11
    @Kevin, мой ответ о показанном коде и правильный для него. Практически в любом C-вопросе здесь предполагается, что неизвестные определения препроцессора могут изменить все. В этом случае ответы, которые рассматривают препроцессор, действительно лучше, но это не делает мои неправильные.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню