我正在尝试理解来自Tcl documentation
的代码typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
我知道typedef的目的是为现有类型指定替代名称,那么为什么需要将typedef int指向 function ?如何使用它?
答案 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 *)
。