查看OpenCL头文件,我看到:
typedef struct _cl_context * cl_context;
我理解cl_context
是指向前向声明的结构_cl_context
的指针。
从图书馆设计师的角度来看,这样做有什么好处:
typedef struct _cl_context cl_context;
API调用是否可以cl_context
代替cl_context*
?但如果是这样,为什么不这样做:
typedef void *cl_context;
答案 0 :(得分:5)
这是一种构建API的类型安全方法,不会暴露类型的内部(这是实现细节)。
typedef struct _cl_context* cl_context;
这样做允许您使用类型cl_context,定义API,而在头文件中的任何位置定义struct _cl_context。所有人都清楚,函数将此类型(指针)作为参数,但用户不需要使用struct _cl_context的详细信息。结构可以在别处定义(在.c文件或私有标头中)。
您提到的另一种方法是:
typedef void* cl_context;
这也用于很多地方。但是,在解释参数之前,需要在整个代码中进行类型转换。它不是类型安全的。用户可以传入任何指针作为参数,编译器将接受它 - 这不是一件好事。使用真实类型可以确保某些安全性来自于来回传递的参数。
答案 1 :(得分:2)
在C中,当您声明一个类似的结构时:
struct foo { };
要声明此结构的实例,您会说:
struct foo f;
因此,C程序员倾向于声明结构如:
typedef struct foo { } foo;
同样,foo
是struct foo
C ++的这个要求已经消失。
我不认为typedef struct cl_context;
会编译。也许你的意思是typedef struct _cl_context cl_context;
?
是不是API调用可以使用cl_context而不是cl_context *?
该typedef负责处理这两种情况,并且无需使用struct
添加类型声明。
您肯定不想使用typedef void *cl_context;
,因为这样会失去类型安全性。