Анонимные функции, использующие операторные выражения GCC

Этот вопрос не очень специфичен; он действительно предназначен для моего собственного обогащения 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__; });

Итак, это мои вопросы:

  1. Что именно делает строка int (*X ); объявлять? Конечно, int *X; — это указатель на целое число, но чем они отличаются?

  2. взгляните на расширенный макрос, что, черт возьми, делает окончательный __fn__?Если я напишу тестовую функцию void test() { printf("hello"); } test;-, она сразу же выдаст ошибку. Я не понимаю этот синтаксис.

  3. Что это означает для отладки? (Я планирую сам поэкспериментировать с этим и gdb, но опыт и мнения других были бы очень полезны ). Не испортит ли это статические анализаторы?

49
задан royhowie 31 December 2015 в 13:50
поделиться