简体   繁体   中英

Typedef with function pointers in C?

I'm pretty new to C, and I'm having a really hard time reading this line of code and understanding it:

typedef void (*getnxtbyte_t)(void *stream);

From looking around, I now know that it is for a pointer pointing to a function. But could anyone help me clarify this even further? What is the name of this new type? What function is it pointing to? Is the parameter of the function (void* stream) ?

Thanks in advance!

It is a tricky syntax to get used to.

What is the name of this new type?

The type is getnxtbyte_t . (You can read that trailing _t as "type". It's a popular convention.)

A variable of type getnxtbyte_t can hold the address of a function that takes one void * parameter and has return type void .

What function is it pointing to?

Wrong question.

That code merely defines the type. No variables are created so there's no "it" to point to anything.

If you know of a function with the correct signature, such as:

void some_func(void*) {}

You may now create a pointer to it using that typedef:

getnxtbyte_t my_function_pointer = some_func;

This typedef creates a type called getnxtbyte_t . That type is for a pointer to a function that returns void (ie nothing), as shown in the second word. That function takes a single parameter, which is a void * , shown by stream .

So if you had a function with a declaration like this:

void some_function(void *any_name);

Then you could use a typedef like the one in your post:

void *some_param = NULL;
typedef void (*getnxtbyte_t)(void *stream); // declare typedef
getnxtbyte_t func = some_function; // assign
func(some_param); // call

The function pointer type name is getnxtbyte_t . It's not pointing to anything now -- this is a type of pointer, not an actual pointer. It's just like saying

typedef struct foo {int x;} Foo;

you define a type Foo , but no actual instance of that type. And finally, yes, the function takes a single void* argument, and returns void .

I am also new to C, so if there are any errors please correct me.


A pointer that points to a function is formatted like so:

datatype (*POINTER_NAME)(PARAMETERS);

So that's the data type the pointed function returns, the name of the pointer and the parameters the pointed function takes.


Here's how a function pointer looks compared to a normal function declaration:

// normal function declaration
void getnxtbyte_t(void *stream);

// function pointer
void (*getnxtbyte_t)(void *stream);


typedef allows us to create our own type.

// will create a type called getnxtbyte_t
typedef void (*getnxtbyte_t)(void *stream);


At this point we have only declared a type; we are not pointing to anything. So let's create a pointer named func_ptr and point it to a function.

// func_ptr is a pointer of type getnxtbyte_t
getnxtbyte_t func_ptr = another_function;

// calling func_ptr is now the same as calling another_function
func_ptr(an_argument);

// had we not used typedef, we would type:
void (*getnxtbyte_t)(void *stream) = another_func;
getnxtbyte_t(an_argument);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM