Этот вопрос не очень специфичен; это действительно для моего собственного обогащения C, и я надеюсь, что другие могут найти его полезным.
Отказ от ответственности: я знаю, что у многих будет импульс, чтобы ответить "если вы пытаетесь сделать FP, тогда просто используйте функциональный язык". Я работаю во встроенной среде, которая должна связываться со многими другими библиотеками C и не имеет большого пространства для многих более крупных общих библиотек и не поддерживает многие языковые процессы. Более того, динамическое распределение памяти не может быть и речи. Мне тоже очень любопытно.
Многие из нас видели этот отличный макрос макроса для лямбда-выражений:
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
И пример использования:
int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example
Используя gcc -std=c89 -E test.c
, лямбда расширяется до:
int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });
Итак, это мои вопросы:
-
Что конкретно делает строка int (* X); объявлять? Конечно, int * X; является указателем на целое число, но как эти два отличаются?
-
Взглянув на exapnded macro, что делает последний
__fn__
? Если я пишу тестовую функциюvoid test() { printf("hello"); } test;
-, которая сразу же выдает ошибку. Я не понимаю этот синтаксис. -
Что это значит для отладки? (Я планирую экспериментировать с этим и gdb, но другие впечатления или мнения были бы замечательными). Будет ли это испортить статические анализаторы?