ヘッダー ファイルに次のようなコードがあります。
typedef struct _bn bnode;
できます
bnode b;
大丈夫ですが、
b[i]
、ここで i は int で、次のエラーが表示されます。
未定義の型「struct _bn」の無効な使用</p>
何か案は?
ヘッダー ファイルに次のようなコードがあります。
typedef struct _bn bnode;
できます
bnode b;
大丈夫ですが、
b[i]
、ここで i は int で、次のエラーが表示されます。
未定義の型「struct _bn」の無効な使用</p>
何か案は?
前述のとおり、 は配列でb
はないため、配列としてアクセスすることはできません。
また、コンパイラがその構造体のサイズをどのように把握することを期待していますか? あなたが何かをするときbnode b[i]
、後で使用するために一定量のスペースを確保する必要があります. あなたがそれを持っているので、サイズはありません。
あなたの不透明度はあなたのために何をするつもりですか? 達成しようとしていることをさらに説明すると、より明確な答えが得られるかもしれません...
不透明な構造体の配列を定義することはできません。実行すると、次のようなエラーが発生します。
エラー:配列型の要素型が不完全です
(特定のエラーテキストは異なります。上記のものはgcc 4.4.1からのものです)。
しかし、あなたができることは、不透明な構造体へのポインターの配列を作成することです。構造体の詳細はポインタのサイズに影響を与えないため、これは実行可能です。
typedef struct _bn bnode;
bnode *b[20];
API/ライブラリに関する限り、通常、不透明な構造が必要な場合、API のユーザーが配列や静的インスタンスなどを宣言することを許可しないのは、このためです。構造について何も知らないことはゲームの名前であるため、それらを操作するためにいくつかの関数を定義する必要があるでしょう。不透明な構造を宣言するほとんどの C ライブラリには、多くの場合、アクセサー関数と変更関数があります。
1 つの例は Lua からのものです (明らかに、Lua の状態は使い捨ての構造ですが、それはアイデアです)。
typedef struct lua_State lua_State;
void lua_pushnumber(lua_State *s, lua_Number n);
この場合、複数の Lua ステートが必要であると判断した場合は、次のようにします。
lua_State *states[5];
for(int i = 0; i < 5; i++)
states[i] = lua_open();
一般的な経験則は、不透明な構造を扱っている場合、ポインターのみを使用して作業することであり、とにかくそれを行う唯一の方法だと思います。
不透明なポインター/PIMPLの実装が必要か、適切なヘッダー ファイルを含める必要があるようです。
C++ の構造体はクラスとほぼ同じであるため、同じ手法が適用されます。
それらの配列を作成できるようにするには、少なくとも bnode のサイズを知る必要があります。
bnodeの不透明な定義で、次のことができます。
typedef struct bnode_struct {
uint8_t opaque_bytes[1024]; /* magically just "know" how big it is. */
} bnode;
次に、次のことができます。
bnode b[10];
そしてそれはうまくいくでしょう。