¿Qué significan los paréntesis alrededor del nombre de una función?

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 asterisco junto a foo , por lo que no es un puntero a la función. ¿O es eso? ¿Qué está pasando aquí con la llamada recursiva?

A falta de preprocesamiento, la firma de foo es equivalente a

 int foo (int *bar) 

El único contexto en el que he visto a personas colocar paréntesis aparentemente innecesarios alrededor de nombres de funciones es cuando hay una función y una macro similar a una función con el mismo nombre, y el progtwigdor desea evitar la expansión de macros.

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 esas funciones / macro par 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 es casi idéntica a la anterior, por lo que sospecho que esto también está sucediendo en su código.

Las parantheses no cambian la statement, todavía está definiendo una función ordinaria llamada foo .

La razón por la que se han utilizado es casi seguro porque hay una macro llamada foo definida como función:

 #define foo(x) ... 

Usar (foo) en la statement de función evita que esta macro se expanda aquí. Entonces, lo que probablemente está sucediendo es que una función foo() se está definiendo con su cuerpo expandiéndose desde el macro foo similar a la 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 a la función, a veces se ven paréntesis extraños que significan algo. Pero este no es el caso aquí.