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


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

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

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

3 211

3 ответа:

в отсутствие каких-либо препроцессора дела, foo's подпись эквивалентна

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 */
}

ваша функция выглядит почти идентично выше, поэтому я подозреваю, что это то, что происходит в вашем коде тоже.

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

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

#define foo(x) ...

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

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

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