理解C语言的类型定义
Understanding C typedef
我试图理解这段代码,这是来自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 *)
。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?