Понимание C typedef
Я пытаюсь понять этот код, который из документации Tcl
typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
Как я знаю, цель typedef заключается в назначении альтернативных имен существующим типам, поэтому зачем нужно для typedef int выполнять функцию? Как это можно использовать?
Ответы
Ответ 1
Я знаю, что целью 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 для использования этой функции.
Ответ 2
typedef также может использоваться для объявления функции say "имя_функции", и это "имя_функции" может использоваться для объявления другой функции с похожим типом и параметрами.
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 *)
.