Em um dos arquivos de origem do meu projeto, encontrei esta definição de função C:
int (foo) (int *bar)
{
return foo (bar);
}
Nota: não existe um asterisco ao lado foo
, portanto não é um ponteiro de função. Ou é? O que está acontecendo aqui com a chamada recursiva?
c
function
parentheses
user1859094
fonte
fonte
a(b);
? Declaração deb
como uma variável do tipoa
? Ou uma chamada para funcionara
com argumentob
? A diferença é sintática, e você não pode saber de que maneira analisá-la sem consultar as informações da declaraçãoa
; ou seja, são parênteses de chamada de função postfix ou parênteses opcionais ao redor de um declarador.Respostas:
Na ausência de qualquer material do pré-processador,
foo
a assinatura é equivalente aO único contexto em que vi pessoas colocando parênteses aparentemente desnecessários em torno de nomes de funções é quando há uma função e uma macro semelhante à função com o mesmo nome, e o programador deseja impedir a expansão da macro.
Essa prática pode parecer um pouco estranha no começo, mas a biblioteca C cria um precedente ao fornecer algumas macros e funções com nomes idênticos .
Um desses pares função / macro é
isdigit()
. A biblioteca pode defini-lo da seguinte maneira:Sua função parece quase idêntica à acima, então eu suspeito que isso também está acontecendo no seu código.
fonte
foo(bar)
interna da função está usando a macro correspondente.foo (int* bar)
seria substituído, mas não(foo) (int *bar)
(o próximo token depoisfoo
é)
)(isdigit)(5)
:?Os parênteses não alteram a declaração - ainda está apenas definindo uma função comum chamada
foo
.A razão pela qual eles foram usados é quase certamente porque existe uma macro de função chamada
foo
definida:O uso
(foo)
na declaração de função impede que essa macro seja expandida aqui. Portanto, o que provavelmente está acontecendo é que uma funçãofoo()
está sendo definida com seu corpo sendo expandido a partir da macro semelhante à funçãofoo
.fonte
Os parênteses não têm sentido.
O código que você mostra não passa de uma recursão infinita.
Ao definir um ponteiro de função, você às vezes vê parênteses estranhos que realmente significam algo. Mas este não é o caso aqui.
fonte