1

我的头文件中有如下代码:

typedef struct _bn bnode;

我可以

bnode b;

很好,但是

b[i],其中 i 是一个 int 给我以下错误:

未定义类型'struct _bn'的无效使用</p>

有任何想法吗?

4

5 回答 5

3

如前所述,b它不是一个数组,因此不能作为一个数组访问。

另外,您希望编译器如何计算出该结构的大小?当你做某事之类bnode b[i]的时候,一定要留出一定的空间供以后使用。正如你有它没有大小。

你的不透明度打算为你做什么?也许如果你进一步解释你想要完成的事情,你会得到一个更有启发性的答案......

于 2009-10-09T18:03:26.540 回答
1

听起来您要么想要一个不透明的指针/PIMPL实现,要么应该包含适当的头文件。

C++ 中的结构几乎与类相同,因此应用相同的技术。

于 2009-10-09T18:02:28.053 回答
1

您不能定义不透明结构的数组。如果你这样做,你会得到一个错误,例如:

错误:数组类型的元素类型不完整

(具体的错误文本会有所不同;上面的一个来自 gcc 4.4.1)。

但是您可以做的是创建一个指向不透明结构的指针数组。这是可行的,因为结构的细节不会影响指针的大小。

typedef struct _bn bnode;
bnode *b[20];
于 2009-10-09T23:14:54.553 回答
1

就 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();

我认为一般的经验法则是,如果你正在使用不透明的结构,你将只通过指针工作,这几乎是唯一的方法。

于 2009-10-10T15:55:26.233 回答
0

您至少必须知道 bnode 的大小才能制作它们的数组。

您可以在 bnode 的不透明定义中执行以下操作:

typedef struct bnode_struct {
   uint8_t opaque_bytes[1024]; /* magically just "know" how big it is. */
} bnode;

然后你可以这样做:

bnode b[10];

它会起作用。

于 2009-10-09T18:17:16.027 回答