typedef中的C / C ++前向声明

时间:2013-09-06 01:32:12

标签: c++ c opencl typedef forward-declaration

查看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;

2 个答案:

答案 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;

同样,foostruct foo

的typedef

C ++的这个要求已经消失。

我不认为typedef struct cl_context;会编译。也许你的意思是typedef struct _cl_context cl_context;

  

是不是API调用可以使用cl_context而不是cl_context *?

该typedef负责处理这两种情况,并且无需使用struct添加类型声明。

您肯定不想使用typedef void *cl_context;,因为这样会失去类型安全性。