Понимание 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 *).