Понимание C typedef

Я пытаюсь понять этот код, который из Документация Tcl

typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);

Как я знаю, цель typedef — присвоить альтернативные имена существующим типам, поэтому зачем нужно typedef int для функция? Как это можно использовать?

12

Решение

Я знаю, что цель typedef — присвоить альтернативные имена существующим типам.

Именно так. Функции имеют типы, и это присваивает имя Tcl_DriverOutputProc к этому типу функции. Сам тип функции пишется как функция с отсутствующим именем:

int(ClientData, const char *, int, int *)

и, как и в случае объявления функции, вы можете включить имена параметров или оставить их по своему усмотрению.

Как это можно использовать?

Вы можете использовать указатели на функции для определения поведения во время выполнения; например:

typedef void function();
void hello()   {printf("Hello\n");}
void goodbye() {printf("Goodbye\n");}

int main() {
function * pf = hello;
pf(); // prints "Hello"pf = goodbye;
pg(); // prints "Goodbye"}

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

16

Другие решения

typedef также можно использовать для объявления функции, скажем «имя_функции», а это «имя_функции» можно использовать для объявления другой функции с аналогичным типом и параметрами.

typedef function_name( int, int);

function_name function1;
function_name *function2;

Здесь, в вашем случае оператор typedef используется для объявления функции «Tcl_DriverOutputProc». И «Tcl_DriverOutputProc» используется в «struct Tcl_ChannelType» для объявления «* outputProc».

«struct Tcl_ChannelType» находится в конце документации Tcl.

typedef struct Tcl_ChannelType {
const char *typeName;
Tcl_ChannelTypeVersion version;
Tcl_  DriverCloseProc *closeProc;
Tcl_DriverInputProc *inputProc;
Tcl_DriverOutputProc *outputProc;   // <-- DriverOutputproc is used here.
Tcl_DriverSeekProc *seekProc;
Tcl_DriverSetOptionProc *setOptionProc;
Tcl_DriverGetOptionProc *getOptionProc;
Tcl_DriverWatchProc *watchProc;
Tcl_DriverGetHandleProc *getHandleProc;
Tcl_DriverClose2Proc *close2Proc;
Tcl_DriverBlockModeProc *blockModeProc;
Tcl_DriverFlushProc *flushProc;
Tcl_DriverHandlerProc *handlerProc;
Tcl_DriverTruncateProc *truncateProc;
}Tcl_ChannelType;
3

Синтаксис typedefs для типов функций wierd — имя создаваемого вами типа появляется в средний. Как уже сказал Майк Сеймур, это присваивает имя Tcl_DriverOutputProc к типу функции int(ClientData, const char *, int, int *),

0
По вопросам рекламы [email protected]