2013-05-07 2 views
3

Как интерпретировать следующую инструкцию typedef.

У меня уже есть некоторые знания через преобразования типов. Они используются для повторного интерпретации байтов за переменной как другого типа. Пример:Как я могу интерпретировать следующую инструкцию typedef

unsigned char* byte = (unsigned char*) (some signed char); 

Но теперь я вижу следующее заявление:

typedef void (*uv_read_cb)(uv_stream_t* stream, ssize_t nread, uv_buf_t buf); 

https://github.com/bodokaiser/libuv/blob/master/include/uv.h#L314

Что совершенно сбивает с толком меня является:

  • нет названия ЬурейеГо
  • как мы можем сделать преобразование типа на некотором ar guments ???

Есть ли у кого-нибудь ответ на эти вопросы?

ответ

5

ЬурейеЕ имеет имя ... uv_read_cb, который является указателем на функцию, которая принимает uv_stream_t*, а ssize_t и uv_buf_t аргумент и возвращает void.

Это позволяет добавлять вещи, такие как указатель на функцию в структуре, передавать указатели на функции и т. Д., Позволяя вам определить, какой тип функции можно присвоить переменной или передать ...

typedef void (*uv_read_cb)(uv_stream_t* stream, ssize_t nread, uv_buf_t buf); 

struct myVTable 
{ 
    uv_read_cb uv_read_callback; 
}; 

void myVFunction( uv_stream_t* stream, uv_read_db callback) 
{ 
    ssize_t length = 100; 
    uv_buf_t buf; 
    myVTable table; 

    table.uv_read_callback = callback; 

    table.uv_read_callback(stream, length, buf); 

    // or you could alternatively use 'callback(stream, length, buf);' 
} 
+0

Я считаю, что 'table.uv_read_callback (steam, lenght, buf);' вместо 'callback (steam, length, buf);', в конце вашего примера было бы более уместным объяснить, как указатели на функции полезны. –

+0

Достаточно справедливо - отредактировано соответственно. –

3

Это указатель на функцию, которая получает uv_stream_t*, ssize_t и uv_buf_t и возвращает ничтожным. uv_read_cb также является типом, и вы можете использовать его для определения других функций с одной и той же сигнатурой. Например:

uv_read_cb my_func; 
+0

Значит, он использовал, чтобы проверить, принимает ли функция определенные параметры без строгой реализации самой реализации (что было бы при использовании прямого определения функции)? Я в порядке? Что будет немного более выразительным примером? – bodokaiser

1

Это утверждение определяет uv_read_cb как указатель на функцию, которая возвращает ничтожным.

+0

Почти: s/как указатель на/в качестве псевдонима для указателя * type * для / – Jens

Смежные вопросы