我正在尝试理解这段代码,它来自Tcl文档
typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
据我所知,typedef 的目的是将现有类型指定为替代名称,那么为什么需要将 int 定义为函数呢?这可以用来做什么?
我正在尝试理解这段代码,它来自Tcl文档
typedef int Tcl_DriverOutputProc(
ClientData instanceData,
const char *buf,
int toWrite,
int *errorCodePtr);
我知道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使用该函数。std::function<void()>
)。 - Mike Seymourstd::result_of
和std::function
等内容而设计的。今天仍然有一些关于老式C需要学习的东西 ;) - Christian Raupf();
而不是 pg();
。但是因为这是一个非常老的回答,我不会进行编辑...也许我错过了什么。 - Support Ukrainetypedef也可以用来声明一个函数,例如"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;
函数类型的typedef语法很奇怪——你正在创建的类型名称出现在中间。正如Mike Seymour所说,这将名称Tcl_DriverOutputProc
分配给函数类型int(ClientData,const char *,int,int *)
。