Язык С: можно ли вернуть функцию из другой функции?

В С++ этот вопрос решается возвращением функционального объекта с перегруженным оператором ().

Можно ли в чистом си сделать так, чтобы функция в виде своего результата возвращала другую функцию, что-то на подобии этого:

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: Как присобачить каррирование, не знаю.

→ Ссылка