Typedef с указателями на функции в C? - PullRequest
2 голосов
/ 17 января 2012

Я довольно новичок в C, и мне очень тяжело читать эту строку кода и понимать ее:

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

Глядя вокруг, я теперь знаю, что это указатель, указывающий на функцию. Но может ли кто-нибудь помочь мне уточнить это еще дальше? Как называется этот новый тип? На какую функцию он указывает? Является ли параметр функции (void* stream)?

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 17 января 2012

Это сложный синтаксис, к которому нужно привыкнуть.

Как называется этот новый тип?

Тип getnxtbyte_t. (Вы можете прочитать этот конечный _t как «тип». Это популярное соглашение.)

Переменная типа getnxtbyte_t может содержать адрес функции, которая принимает один параметр void * и имеет тип возврата void.

На какую функцию он указывает?

Неправильный вопрос.

Этот код просто определяет тип. Переменные не создаются, поэтому нет «это», чтобы указать на что-либо.

Если вам известна функция с правильной подписью, например:

void some_func(void*) {}

Теперь вы можете создать указатель на него, используя этот typedef:

getnxtbyte_t my_function_pointer = some_func;
1 голос
/ 17 января 2012

Этот typedef создает тип с именем getnxtbyte_t. Этот тип предназначен для указателя на функцию, которая возвращает void (т.е. ничего), как показано во втором слове. Эта функция принимает один параметр, который является void *, показанным как stream.

Итак, если у вас была функция с объявлением, подобным этому:

void some_function(void *any_name);

Тогда вы можете использовать typedef, как в вашем посте:

void *some_param = NULL;
typedef void (*getnxtbyte_t)(void *stream); // declare typedef
getnxtbyte_t func = some_function; // assign
func(some_param); // call
0 голосов
/ 17 января 2012

Я также новичок в C, поэтому, если есть какие-либо ошибки, пожалуйста, исправьте меня.


Указатель, указывающий на функцию, отформатирован так:

datatype (*POINTER_NAME)(PARAMETERS);

Так что это тип данных , который возвращает указанная функция, имя указателя и параметры , которые указанная функция принимает.


Вот как выглядит указатель на функцию по сравнению с обычным объявлением функции:

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

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


typedef позволяет нам создавать наш собственный тип.

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


На данный момент мы только объявили тип; мы ни на что не указываем. Итак, давайте создадим указатель с именем func_ptr и наведем его на функцию.

// 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);
0 голосов
/ 17 января 2012

Имя типа указателя функции - getnxtbyte_t. Сейчас он ни на что не указывает - это указатель типа , а не фактический указатель. Это как сказать

typedef struct foo {int x;} Foo;

вы определяете тип Foo, но фактический экземпляр этого типа отсутствует. И, наконец, да, функция принимает один аргумент void* и возвращает void.

...