sirve que para estructuras arreglo c typedef function-declaration

que - ¿Se puede utilizar una función prototipo typedef en las definiciones de funciones?



typedef c++ para que sirve (2)

No puede definir una función usando un typedef para un tipo de función. Está explícitamente prohibido, consulte 6.9.1 / 2 y la nota al pie asociada:

El identificador declarado en una definición de función (que es el nombre de la función) tendrá un tipo de función, según lo especificado por la parte del declarador de la definición de la función.

La intención es que la categoría de tipo en una definición de función no se pueda heredar de un typedef:

typedef int F(void); // type F is "function with no parameters // returning int" F f, g; // f and g both have type compatible with F F f { /* ... */ } // WRONG: syntax/constraint error F g() { /* ... */ } // WRONG: declares that g returns a function int f(void) { /* ... */ } // RIGHT: f has type compatible with F int g() { /* ... */ } // RIGHT: g has type compatible with F F *e(void) { /* ... */ } // e returns a pointer to a function F *((e))(void) { /* ... */ } // same: parentheses irrelevant int (*fp)(void); // fp points to a function that has type F F *Fp; //Fp points to a function that has type F

Tengo una serie de funciones con el mismo prototipo, digo

int func1(int a, int b) { // ... } int func2(int a, int b) { // ... } // ...

Ahora, quiero simplificar su definición y declaración. Por supuesto que podría usar una macro como esa:

#define SP_FUNC(name) int name(int a, int b)

Pero me gustaría mantenerlo en C, así que intenté usar el especificador de almacenamiento typedef para esto:

typedef int SpFunc(int a, int b);

Esto parece funcionar bien para la declaración:

SpFunc func1; // compiles

pero no para la definición:

SpFunc func1 { // ... }

lo que me da el siguiente error:

error: expected ''='', '','', '';'', ''asm'' or ''__attribute__'' before ''{'' token

¿Hay alguna manera de hacer esto correctamente o es imposible? A mi entender de C, esto debería funcionar, pero no funciona. ¿Por qué?

Tenga en cuenta que gcc entiende lo que estoy tratando de hacer, porque si escribo

SpFunc func1 = { /* ... */ }

me dice

error: function ''func1'' is initialized like a variable

Lo que significa que gcc entiende que SpFunc es un tipo de función.


Un typedef define un tipo , no un encabezado (que es un texto de código fuente). Tienes que usar #define (aunque no lo recomiendo) si necesitas factorizar el código para el encabezado.

([Editado] La razón por la que el primero funciona es porque no está definiendo un prototipo; está definiendo una variable del tipo definido por typedef , que no es lo que desea).