89

C の不透明ポインターの概念の背後にある使用法とロジックを教えてもらえますか?

4

3 に答える 3

138

不透明なポインターは、基になるデータの詳細が明らかにされていないポインターです (辞書の定義から: opaque: adjective; not able to be see through; not transparent )。

たとえば、ヘッダーファイルで宣言できます(これは私の実際のコードの一部からのものです):

typedef struct pmpi_s *pmpi;

これは、不透明な構造体pmpiへのポインターである型を宣言するため、宣言したものはすべて不透明なポインターになります。 struct pmpi_spmpi

その宣言のユーザーは、次のようなコードを自由に書くことができます。

pmpi xyzzy = NULL;

構造の実際の「定義」を知らなくても。

次に、定義について知っているコード (つまり、pmpi処理のための機能を提供するコード) で、構造を「定義」できます。

struct pmpi_s {
    uint16_t *data;     // a pointer to the actual data array of uint16_t.
    size_t sz;          // the allocated size of data.
    size_t used;        // number of segments of data in use.
    int sign;           // the sign of the number (-1, 0, 1).
};

個々のフィールドに簡単にアクセスできますが、これはヘッダー ファイルのユーザーにはできないことです。

詳細については、ウィキペディアの不透明なポインターのページを参照してください。

その主な用途は、ライブラリのユーザーから実装の詳細を隠すことです。カプセル化 (C++ の群衆があなたに言うことにもかかわらず) は長い間存在しています :-)

ユーザーがライブラリを効果的に利用できるように、ライブラリの詳細を公開する必要があります。さらに公開すると、ユーザーが信頼するようになる可能性のある詳細が提供されます (サイズ変数szが構造内の特定の場所にあり、コントロールをバイパスして直接操作する可能性があるという事実など)。

そうすると、内部を変更すると、顧客が激しく不平を言うのに気付くでしょう。その構造情報がなければ、API は提供するものだけに制限され、内部に関する行動の自由は維持されます。

于 2011-09-26T10:31:58.867 に答える