C の不透明ポインターの概念の背後にある使用法とロジックを教えてもらえますか?
3 に答える
不透明なポインターは、基になるデータの詳細が明らかにされていないポインターです (辞書の定義から: opaque: adjective; not able to be see through; not transparent )。
たとえば、ヘッダーファイルで宣言できます(これは私の実際のコードの一部からのものです):
typedef struct pmpi_s *pmpi;
これは、不透明な構造体pmpi
へのポインターである型を宣言するため、宣言したものはすべて不透明なポインターになります。 struct pmpi_s
pmpi
その宣言のユーザーは、次のようなコードを自由に書くことができます。
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 は提供するものだけに制限され、内部に関する行動の自由は維持されます。