理解C语言的类型定义

Understanding C typedef

本文关键字:类型 定义 语言 理解      更新时间:2023-10-16

我试图理解这段代码,这是来自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("Hellon");}
void goodbye() {printf("Goodbyen");}
int main() {
    function * pf = hello;
    pf(); // prints "Hello"
    pf = goodbye;
    pg(); // prints "Goodbye"
}

在这种情况下,它允许您编写一个函数来处理TCL输出的某些方面,并告诉TCL使用该函数。

typedef也可以用来声明一个函数,比如" function_name ",这个" function_name "可以用来声明另一个具有类似类型和参数的函数。

typedef function_name( int, int);
function_name function1;
function_name *function2;

在这里,在你的例子中,typedef语句用于声明"Tcl_DriverOutputProc"函数。在struct Tcl_ChannelType中使用" Tcl_DriverOutputProc "来声明" *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语法很奇怪——您创建的类型名称出现在中间。正如Mike Seymour已经说过的,这将名称Tcl_DriverOutputProc分配给函数类型int(ClientData, const char *, int, int *)