Инициализация указателя функции на новую функцию в C

#c #function-pointers

#c #указатели на функции

Вопрос:

Я хотел бы преобразовать

 typedef double (*Function)(double s[4]);
double f1 (double x[N]) {return x[0]*x[1];}
Function t = f1;
 

к чему-то вроде этого:

 typedef double (*Function)(double s[4]);
Function t = ({ return x[0]*x[1];});
 

который возвращает ошибку «пустое значение, которое не игнорируется, как должно быть».
Как я могу заставить это работать?

Комментарии:

1. В C нет лямбд, если только это не расширение, специфичное для компилятора.

2. @SuperStormer грязный обходной путь в моем ответе — но требует расширения вложенных функций.

Ответ №1:

В C нет анонимных функций или лямбда-выражений. Так что это невозможно.


РЕДАКТИРОВАТЬ: ПСЕВДО-ЛЯМБДА

Крошечный грязный обходной путь для компиляторов, которые допускают вложенные функции:

 #define lmb(rt, fb)({rt fn__fn__fn_ fb fn__fn__fn_; })

int main(void)
{
    double (*f)(double x[]) = lmb(double, (double x[]) { return x[0] * x[1]; });
    double  x[] = {4.0, 5.0};

    printf("%fn", f(x));
}