Anduvimos indagado por distintos espacios y así darte la respuesta para tu duda, si continúas con dudas puedes dejarnos la inquietud y respondemos con gusto.
Solución:
Es un typedef
a un tipo de función. La intención es usarlo para punteros de función, pero en este caso la sintaxis para usarlo sería:
int bar(void);
fc_name* foo = bar; /* Note the * */
Actualización: como se menciona en los comentarios a la respuesta de Jonathan Leffler, el typedef
Se puede utilizar para declarar funciones. Un uso podría ser declarar un conjunto de funciones de devolución de llamada:
typedef int (callback)(int, void*);
callback onFoo;
callback onBar;
callback onBaz;
callback onQux;
Los primeros paréntesis son superfluos, es equivalente a:
typedef int fc_name(void);
No creo que esto haga nada útil, aunque no puedo hacer que GCC se queje por sí solo.
Esto significa que fc_name
es un alias para un tipo de función que no acepta argumentos y devuelve un int
. No es tan útil directamente, aunque puede declarar, por ejemplo, el rand()
función usando:
fc_name rand;
No puedes usar el typedef
en una definición de función.
Un puntero a la función typedef diría:
typedef int (*fc_name)(void);
Este código muestra que los typedefs sin el asterisco no son punteros de función (que abordan una respuesta alternativa ahora eliminada):
static int function(void)
return 0;
typedef int fc_name1 (void);
typedef int (fc_name2)(void);
typedef int (*fc_name3)(void);
fc_name1 x = function;
fc_name2 y = function;
fc_name3 z = function;
Cuando se compila, ‘gcc’ dice:
gcc -Wextra -Wall -pedantic -c -O x.c
x.c:10:1: error: function ‘x’ is initialized like a variable
x.c:11:1: error: function ‘y’ is initialized like a variable
Y este código demuestra que de hecho puedes usar fc_name *var = funcname;
como sugiere jamesdlin:
static int function(void)
return 0;
typedef int fc_name1 (void);
typedef int (fc_name2)(void);
typedef int (*fc_name3)(void);
fc_name1 x_0 = function;
fc_name1 *x_1 = function;
fc_name2 y_0 = function; // Damn Bessel functions - and no
fc_name2 *y_1 = function; // Damn Bessel functions - and no
fc_name3 z = function;
Usando y0, y1 genera advertencias GCC:
x.c:12:11: warning: conflicting types for built-in function ‘y0’
x.c:13:11: warning: built-in function ‘y1’ declared as non-function
Y, basándose en el comentario de Schot:
static int function(void)
return 0;
typedef int fc_name1 (void);
typedef int (fc_name2)(void);
typedef int (*fc_name3)(void);
fc_name1 x_0 = function; // Error
fc_name1 *x_1 = function; // x_1 is a pointer to function
fc_name1 x_2; // Declare int x_2(void);
fc_name1 *x_3 = x_2; // Declare x_3 initialized with x_2
fc_name2 y_0 = function; // Damn Bessel functions - and no
fc_name2 *y_1 = function; // Damn Bessel functions - and no
fc_name1 y_2; // Declare int y_2(void);
fc_name1 *y_3 = x_2; // Declare y_3 initialized with y_2
fc_name3 z = function;
Interesante: las esquinas oscuras de C son realmente turbias.