Язык С: можно ли вернуть функцию из другой функции?
В С++ этот вопрос решается возвращением функционального объекта с перегруженным оператором ().
Можно ли в чистом си сделать так, чтобы функция в виде своего результата возвращала другую функцию, что-то на подобии этого:
void (*message) (void) function(int args) {
return void (*newMessage) (void);
}
Или еще проще:
message function(int args) {
return void (*newMessage) (void);
}
Ответы (2 шт):
Автор решения: HolyBlackCat
→ Ссылка
Можно вернуть указатель на функцию (в С++ это тоже работает):
void a() {}
// Вариант 1
void (*b(int args))()
{
(void)args;
return a;
}
// Вариант 2
typedef void func_t();
func_t *c(int args)
{
(void)args;
return a;
}
// Вариант 3
typedef void (*func_t2)();
func_t2 d(int args)
{
(void)args;
return a;
}
Автор решения: Qwertiy
→ Ссылка
Если каррирование не требуется, то вот так: https://ideone.com/iDYh9y
#include <stdio.h>
typedef int (*func_int_int)(int);
int sqr(int x)
{
return x * x;
}
func_int_int get_f()
{
return sqr;
}
int main(void)
{
func_int_int f = get_f();
int x = f(8);
printf("%d", x);
return 0;
}
Или без typedef: https://ideone.com/LlJKT8
#include <stdio.h>
int sqr(int x)
{
return x * x;
}
int (*get_f())(int)
{
return sqr;
}
int main(void)
{
int (*f)(int) = get_f();
int x = f(8);
printf("%d", x);
return 0;
}
PS: Как присобачить каррирование, не знаю.