2

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!

Karlson
  • 2,958
  • 1
  • 21
  • 48

4 Answers4

5

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;
Drew Dormann
  • 59,987
  • 13
  • 123
  • 180
1

This typedef creates a type called getnxtbyte_t. That type is for a pointer to a function that returns void (i.e. 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
Dan Fego
  • 13,644
  • 6
  • 48
  • 59
0

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.

Ernest Friedman-Hill
  • 80,601
  • 10
  • 150
  • 186
0

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);
Faheem
  • 66
  • 5