我的头文件中有如下代码:
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]
的时候,一定要留出一定的空间供以后使用。正如你有它没有大小。
你的不透明度打算为你做什么?也许如果你进一步解释你想要完成的事情,你会得到一个更有启发性的答案......
听起来您要么想要一个不透明的指针/PIMPL实现,要么应该包含适当的头文件。
C++ 中的结构几乎与类相同,因此应用相同的技术。
您不能定义不透明结构的数组。如果你这样做,你会得到一个错误,例如:
错误:数组类型的元素类型不完整
(具体的错误文本会有所不同;上面的一个来自 gcc 4.4.1)。
但是您可以做的是创建一个指向不透明结构的指针数组。这是可行的,因为结构的细节不会影响指针的大小。
typedef struct _bn bnode;
bnode *b[20];
就 API/库而言,通常如果您需要一个不透明的结构,则不允许 API 的用户因此而声明数组或静态实例之类的东西。对结构一无所知是游戏的名称,因此您可能必须定义一些函数来操作它们。大多数声明不透明结构的 C 库通常具有访问器和修改函数。
一个例子来自 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();
我认为一般的经验法则是,如果你正在使用不透明的结构,你将只通过指针工作,这几乎是唯一的方法。
您至少必须知道 bnode 的大小才能制作它们的数组。
您可以在 bnode 的不透明定义中执行以下操作:
typedef struct bnode_struct {
uint8_t opaque_bytes[1024]; /* magically just "know" how big it is. */
} bnode;
然后你可以这样做:
bnode b[10];
它会起作用。