Что означают круглые скобки вокруг имени функции?
в одном из моих исходных файлов проекта, я нашел это определение функции 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.