C, указатель на функцию с предустановленными аргументами - PullRequest
5 голосов
/ 30 июня 2010

Возможно ли что-то подобное в C?

#include <stdio.h>

void print_str(char *str) {
        printf(str);
}

int main() {

        void (*f_ptr)() = print_str,"hello world";

        f_ptr();

}

//see "hello world" on stdout

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

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

struct f_ptr {
 void (*f)();
 void *data;
}

void exec_f_ptr(f_ptr *data) {
  data->f(data->data):
}

но это было бы не так элегантно, как простой вызов указателя функции с аргументом внутри.

Ответы [ 4 ]

4 голосов
/ 30 июня 2010

То, что вы хотите - это замыкание или функция карри .К сожалению, C не имеет ни одного из них.(Apple представила замыкания в своей версии C, и, надеюсь, они будут приняты для какой-то будущей версии языка, но это не часть C99.)

3 голосов
/ 30 июня 2010

Вы в основном запрашиваете закрытие, а не указатель на функцию, то есть данные и код в одном «объекте». Такие объекты не существуют в стандартном C - вы можете получить что-то похожее из блоков Apple или из анонимных функций в других языках (или из замыканий напрямую в языках, которые их поддерживают), но, вообще говоря, вам придется создать некоторый тип данных как вы обнаружили.

1 голос
/ 30 июня 2010

GLib имеет поддержку для замыканий , используемых в основном для обратных вызовов. Это кроссплатформенный, и может быть стоит посмотреть (в зависимости от ваших требований). (См. Также API закрытия GLib .)

0 голосов
/ 30 июня 2010

Нет, эта структура - самая близкая вещь, которую вы собираетесь получить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...