una - signos de puntuacion
¿Qué significan los paréntesis alrededor de un nombre de función? (3)
En uno de mis archivos de origen de proyecto, encontré esta definición de función C:
int (foo) (int *bar)
{
return foo (bar);
}
Nota: no hay un asterisco junto a foo
, por lo que no es un puntero a función. ¿O es eso? ¿Qué está pasando aquí con la llamada recursiva?
En ausencia de cualquier cosa del preprocesador en marcha, la firma de foo
es equivalente a
int foo (int *bar)
El ú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 a una función con el 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 de C establece un precedente al proporcionar algunas macros y funciones con nombres idénticos .
Una de tales funciones / par de macro es isdigit()
. La biblioteca puede definirlo de la siguiente manera:
/* 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 */
}
Su función parece casi idéntica a la anterior, así que sospecho que esto es lo que está pasando en su código también.
Los paréntesis no cambian la declaración, solo se trata de definir una función ordinaria llamada foo
.
La razón por la que se han utilizado es casi seguro porque existe una macro similar a una función llamada foo
definida:
#define foo(x) ...
El uso de (foo)
en la declaración de función evita que esta macro se expanda aquí. Entonces, lo que está ocurriendo es que se está definiendo una función foo()
con su cuerpo expandido desde la macro foo
similar a una función.
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 se ven paréntesis extraños que sí significan algo. Pero este no es el caso aquí.