Я пытаюсь понять этот код, который из Документация Tcl
typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
Как я знаю, цель typedef — присвоить альтернативные имена существующим типам, поэтому зачем нужно typedef int для функция? Как это можно использовать?
Я знаю, что цель 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 использовать эту функцию.
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;
Синтаксис typedefs для типов функций wierd — имя создаваемого вами типа появляется в средний. Как уже сказал Майк Сеймур, это присваивает имя Tcl_DriverOutputProc
к типу функции int(ClientData, const char *, int, int *)
,