Esta pregunta no es terriblemente específica; es realmente para mi propio enriquecimiento en C y espero que otros también lo puedan encontrar útil.Funciones anónimas utilizando las expresiones de declaración GCC
Descargo de responsabilidad: Sé que muchos tendrán el impulso de responder con "si estás tratando de hacer FP, simplemente utiliza un lenguaje funcional". Trabajo en un entorno incrustado que necesita vincularse a muchas otras bibliotecas C, y no tiene mucho espacio para muchas bibliotecas compartidas más grandes y no admite muchos tiempos de ejecución de idiomas. Además, la asignación de memoria dinámica está fuera de discusión. También soy realmente curioso.
Muchos de nosotros hemos visto este macro ingenioso C para las expresiones lambda:
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
Y un ejemplo de uso es:
int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example
Usando gcc -std=c89 -E test.c
, la lambda se expande a:
int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });
Entonces, estas son mis preguntas:
¿Qué hace exactamente la línea int (* X); declarar? Por supuesto, int * X; es un puntero a un número entero, pero ¿cómo difieren estos dos?
Echando un vistazo a la macro expuesta, ¿qué diablos hace el
__fn__
final? Si escribo una función de pruebavoid test() { printf("hello"); } test;
- eso arroja inmediatamente un error. No entiendo esa sintaxis.¿Qué significa esto para la depuración? (Estoy planeando experimentar con esto y con gdb, pero las experiencias u opiniones de otros serían geniales). ¿Esto arruinaría los analizadores estáticos?
Esto no es ANSI C. –
Además, no veo 'int (* X);' en ninguna parte. –
No está allí como tal. Al tratar de descifrar la sintaxis, estaba un poco perplejo que int (* X); compila, pero no está muy seguro de lo que definió. –