了解C typedef

时间:2013-04-17 10:19:16

标签: c++ c types tcl

我正在尝试理解来自Tcl documentation

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

我知道typedef的目的是为现有类型指定替代名称,那么为什么需要将typedef int指向 function ?如何使用它?

3 个答案:

答案 0 :(得分:16)

  

我知道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使用该函数。

答案 1 :(得分:3)

typedef也可用于声明一个函数,例如“function_name”,这个“function_name”可用于声明具有相似类型和参数的另一个函数。

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;

答案 2 :(得分:0)

函数类型的typedef语法很奇怪 - 您创建的类型名称显示在中间中。正如Mike Seymour所说,这会将名称Tcl_DriverOutputProc分配给函数类型int(ClientData, const char *, int, int *)