Этот вопрос не очень специфичен; он действительно предназначен для моего собственного обогащения C, и я надеюсь, что другие смогут его найти.
Отказ от ответственности :Я знаю, что у многих возникнет порыв ответить: «Если вы пытаетесь сделать FP, тогда просто используйте функциональный язык». другие библиотеки C, и не имеет много места для многих других больших общих библиотек и не поддерживает много языковых сред выполнения. Более того, о динамическом распределении памяти не может быть и речи. Мне также просто очень любопытно.
Многие из нас видел этот отличный макрос 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; — это указатель на целое число, но чем они отличаются?
взгляните на расширенный макрос, что, черт возьми, делает окончательный __fn__
?Если я напишу тестовую функцию void test() { printf("hello"); } test;
-, она сразу же выдаст ошибку. Я не понимаю этот синтаксис.
Что это означает для отладки? (Я планирую сам поэкспериментировать с этим и gdb, но опыт и мнения других были бы очень полезны ). Не испортит ли это статические анализаторы?