我试图理解来自Tcl 文档的这段代码
typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
据我所知,typedef 的目的是为现有类型分配替代名称,那么为什么需要 typedef int 才能起作用?这个怎么用?
我试图理解来自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("Hello\n");}
void goodbye() {printf("Goodbye\n");}
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;
函数类型的 typedef 语法很奇怪——您创建的类型名称出现在中间。正如 Mike Seymour 已经说过的,这会将名称分配给Tcl_DriverOutputProc
函数 type int(ClientData, const char *, int, int *)
。