2

查看 OpenCL 头文件,我看到:

typedef struct _cl_context * cl_context;

我知道这cl_context是一个指向前向声明的 struct 的指针_cl_context

从图书馆设计师的角度来看,这样做有什么好处:

typedef struct _cl_context cl_context;

只是这样 API 调用可以cl_context代替cl_context*吗?但如果是这样,为什么不这样做:

typedef void *cl_context;
4

2 回答 2

5

这是一种构建 API 的类型安全方式,无需暴露类型的内部(即实现细节)。

typedef struct _cl_context* cl_context;

这样做允许您使用类型 cl_context 定义 API,而无需在头文件中的任何位置定义 struct _cl_context。很明显,这些函数将这种类型(指针)作为参数,但用户不必为 struct _cl_context 的细节感到负担。该结构可以在别处定义(在 .c 文件或私有头文件中)。

您提到的另一种方法是:

typedef void* cl_context;

这在很多地方也被使用。但是需要在所有地方的代码中进行类型转换,然后才能解释参数。而且它不是类型安全的。用户可以传入任何指针作为参数,编译器会接受它——这不是一件好事。使用 real 类型可以确保来回传递参数方面的一些安全性。

于 2013-09-06T02:33:44.343 回答
2

在 C 中,当您声明如下结构时:

struct foo { };

要声明这个结构的一个实例,你会说:

struct foo f;

因此,C 程序员倾向于声明如下结构:

typedef struct foo { } foo;

如中,foo是一个 typedefstruct foo

对于 C++,这个要求没有了。

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

是否只是为了 API 调用可以采用 cl_context 而不是 cl_context*?

该 typedef 会同时处理这两个问题,并且无需在类型声明前面加上struct.

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

于 2013-09-06T01:46:01.867 回答