Saltar al contenido

¿Qué significa un typedef con paréntesis como “typedef int (f)()void)” significa? ¿Es un prototipo de función?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *