Mike
Mike

Reputation: 60848

C, function pointer with arguments preset

Is something like this possible in 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

In short, I'd like to have a function pointer that "stores" the arguments. The point is that the function pointer can be used later on without needing a reference to the original data.

I could use something like this to couple a function pointer and an argument reference

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

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

but wouldn't be as elegant as just calling a function pointer with the argument inside.

Upvotes: 5

Views: 1290

Answers (4)

detly
detly

Reputation: 30352

GLib has support for closures, used mainly for signal callbacks. It's cross platform, and might be worth a look (depending on your requirements). (See also the GLib closure API.)

Upvotes: 1

Chuck
Chuck

Reputation: 237110

What you want is a closure or a curried function. Unfortunately, C has neither of these. (Apple did introduce closures in its version of C and hopefully they'll be adopted for some future version of the language, but it's not part of C99.)

Upvotes: 4

Jonathan Grynspan
Jonathan Grynspan

Reputation: 43470

You're basically asking for a closure rather than a function pointer--that is, data and code in one "object." Such objects don't exist in standard C--you can get something similar from Apple's blocks or from anonymous functions in other languages (or from closures outright in the languages that support them) but generally speaking you'll have to construct some data type of your own, as you've discovered.

Upvotes: 3

Bwmat
Bwmat

Reputation: 4694

No, that struct is the closest thing you're going to get

Upvotes: 0

Related Questions