如何在C中定义不透明的struct数组?

时间:2009-10-09 17:58:41

标签: c struct compiler-errors opacity

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

typedef struct _bn bnode;

我能做到

bnode b;

很好,但是

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

无效使用未定义类型'struct _bn'

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

如上所述,b不是数组,因此无法作为一个数组进行访问。

另外,您希望编译器如何计算出该结构的大小?当您执行bnode b[i]之类的操作时,需要留出一定的空间供以后使用。因为你有它没有大小。

你的不透明度是为了什么?也许如果你进一步解释你想要实现的目标,你会得到更具启发性的答案......

答案 1 :(得分:1)

听起来好像要么实现opaque pointer/PIMPL,要么应该包含相应的头文件。

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

答案 2 :(得分:1)

您无法定义不透明结构的数组。如果你这样做会收到错误,例如:

  

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

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

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

typedef struct _bn bnode;
bnode *b[20];

答案 3 :(得分: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();

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

答案 4 :(得分:0)

你必须至少知道bnode的大小才能生成它们的数组。

你可以用bnode的不透明定义来做:

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

然后你可以这样做:

bnode b[10];

它会起作用。