jkl*_*ntz 2 c c++ typedef opencl forward-declaration
查看OpenCL头文件,我看到:
typedef struct _cl_context * cl_context;
Run Code Online (Sandbox Code Playgroud)
我知道这cl_context是一个指向前向声明结构的指针_cl_context.
从图书馆设计师的角度来看,这样做有什么好处:
typedef struct _cl_context cl_context;
Run Code Online (Sandbox Code Playgroud)
这样的API调用可以cl_context代替cl_context*吗?但如果是这样,为什么不这样做:
typedef void *cl_context;
Run Code Online (Sandbox Code Playgroud)
这是一种构建API的类型安全方法,不会暴露类型的内部(这是实现细节).
typedef struct _cl_context* cl_context;
Run Code Online (Sandbox Code Playgroud)
这样做允许您使用类型cl_context定义API,而无需在头文件中的任何位置定义struct _cl_context.所有人都清楚,函数将此类型(指针)作为参数,但用户不需要使用struct _cl_context的详细信息.结构可以在别处定义(在.c文件或私有标头中).
你提到的另一种方法是:
typedef void* cl_context;
Run Code Online (Sandbox Code Playgroud)
这用在很多地方.但是在解释参数之前,需要在整个代码中进行类型转换.它不是类型安全的.用户可以传入任何指针作为参数,编译器将接受它 - 这不是一件好事.使用真实类型可确保在来回传递的参数方面具有一定的安全性.