Что означают круглые скобки вокруг имени функции?
в одном из моих исходных файлов проекта, я нашел это определение функции C:
int (foo) (int *bar)
{
return foo (bar);
}
Примечание: рядом с , Так что это не указатель на функцию. Или это так? Что здесь происходит с рекурсивным вызовом?
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
.