2

OpenCL ヘッダー ファイルを見ると、次のように表示されます。

typedef struct _cl_context * cl_context;

cl_context前方宣言された struct へのポインターであることを理解しています_cl_context

ライブラリ設計者の観点から、これを行うことの利点は次のとおりです。

typedef struct _cl_context cl_context;

cl_contextAPI呼び出しが代わりに取ることができるのはそれだけcl_context*ですか? しかし、もしそうなら、なぜそうしないのですか:

typedef void *cl_context;
4

2 に答える 2

5

これは、タイプの内部 (実装の詳細) を公開せずに、API を構築するタイプセーフな方法です。

typedef struct _cl_context* cl_context;

これを行うと、ヘッダー ファイルのどこにも struct _cl_context を定義しなくても、タイプ cl_context を使用して API を定義できます。関数がこの型 (ポインター) を引数として取ることは誰の目にも明らかですが、ユーザーは struct _cl_context の詳細に煩わされることはありません。構造体は別の場所 (.c ファイルまたはプライベート ヘッダー) で定義できます。

あなたが言及する他のアプローチは次のとおりです。

typedef void* cl_context;

これもいろいろなところで使われています。ただし、引数を解釈する前に、コード全体で型キャストが必要です。また、タイプセーフではありません。ユーザーは任意のポインターを引数として渡すことができ、コンパイラーはそれを受け入れますが、これは良いことではありません。実数型を使用すると、引数がやり取りされるという点である程度の安全性が保証されます。

于 2013-09-06T02:33:44.343 に答える