В одном из исходных файлов моего проекта я нашел определение функции C:
int (foo) (int *bar)
{
return foo (bar);
}
Примечание: рядом нет звездочки foo
, поэтому это не указатель на функцию. Либо это? Что здесь происходит с рекурсивным вызовом?
c
function
parentheses
user1859094
источник
источник
a(b);
? Объявлениеb
в качестве переменной типаa
? Или вызов функцииa
с аргументомb
? Разница в синтаксисе, и вы не можете знать, каким образом ее анализировать, не просматривая информацию объявленияa
; т. е. те скобки постфиксного вызова функции или необязательные скобки вокруг декларатора.Ответы:
В отсутствие каких-либо препроцессорных вещей,
foo
подпись эквивалентнаЕдинственный контекст, в котором я видел людей, помещающих, казалось бы, ненужные скобки вокруг имен функций, - это когда есть функция и похожий на функцию макрос с одинаковым именем, и программист хочет предотвратить расширение макроса.
Поначалу эта практика может показаться немного странной, но библиотека C создает прецедент, предоставляя некоторые макросы и функции с одинаковыми именами. .
Одна такая пара функция / макрос
isdigit()
. Библиотека может определить это следующим образом:Ваша функция выглядит почти так же, как и выше, поэтому я подозреваю, что это происходит и в вашем коде.
источник
foo(bar)
Внутри функции с использованием соответствующего макро.foo (int* bar)
будет заменен, но не будет(foo) (int *bar)
(следующий токен после того,foo
как)
)(isdigit)(5)
?Парантезы не изменяют объявление - оно все еще просто определяет обычную функцию с именем
foo
.Причина, по которой они были использованы, почти наверняка заключается в том, что существует макрос, похожий на функцию с именем
foo
определен:Использование
(foo)
в объявлении функции предотвращает расширение этого макроса здесь. Так что, вероятно, происходит то, что функцияfoo()
определяется с расширением ее тела из макроса, подобного функцииfoo
.источник
Скобки не имеют смысла.
Код, который вы показываете, является ничем иным, как бесконечной рекурсией.
При определении указателя на функцию вы иногда видите странные скобки, которые что-то значат. Но это не тот случай, здесь.
источник