En uno de mis archivos fuente del proyecto, encontré esta definición de función C:
int (foo) (int *bar)
{
return foo (bar);
}
Nota: no hay un asterisco al lado foo
, por lo que no es un puntero de función. ¿O es eso? ¿Qué está pasando aquí con la llamada recursiva?
c
function
parentheses
usuario1859094
fuente
fuente
a(b);
? Declaración deb
como una variable de tipoa
? ¿O una llamada a funcionara
con argumentob
? La diferencia es sintáctica, y no puede saber de qué manera analizarla sin buscar la información de declaración dea
; es decir, esos paréntesis de llamada de función postfix, o paréntesis opcionales alrededor de un declarador.Respuestas:
En ausencia de cosas de preprocesador,
foo
la firma es equivalente aEl único contexto en el que he visto a personas poner paréntesis aparentemente innecesarios alrededor de los nombres de funciones es cuando hay una función y una macro similar al mismo nombre, y el programador quiere evitar la expansión de la macro.
Esta práctica puede parecer un poco extraña al principio, pero la biblioteca C establece un precedente al proporcionar algunas macros y funciones con nombres idénticos .
Una de estas funciones / macro par es
isdigit()
. La biblioteca podría definirlo de la siguiente manera:Su función se ve casi idéntica a la anterior, por lo que sospecho que esto también está sucediendo en su código.
fuente
foo(bar)
interior de la función está utilizando la macro correspondiente.foo (int* bar)
lo que sería reemplazado, pero no(foo) (int *bar)
(el siguiente token despuésfoo
es)
)(isdigit)(5)
?Las paréntesis no cambian la declaración, todavía solo define una función ordinaria llamada
foo
.La razón por la que se han utilizado es casi con certeza porque hay una macro similar a una función llamada
foo
definida:El uso
(foo)
en la declaración de función evita que esta macro se expanda aquí. Entonces, lo que probablemente está sucediendo es que una funciónfoo()
se está definiendo con su cuerpo expandido desde la macro similar a una funciónfoo
.fuente
Los paréntesis no tienen sentido.
El código que muestra no es más que una recursión infinita.
Al definir un puntero de función, a veces ve paréntesis extraños que significan algo. Pero este no es el caso aquí.
fuente