我对 C 中的前向声明有疑问。
Code
typedef struct yhash_s t_yhash;// forward declaration
struct yhash_s {
size_t size_h;
t_yhash (*yhash)[];// pointer to array of structures
};
一旦用 gcc 编译代码,它就会抱怨:
错误:数组类型具有不完整的元素类型“t_yhash”{aka“struct yhash_s”}
我确实明白t_yhash
尚不知道并且无法计算数组的大小,但我询问的是指向未知但大小的数组的指针,恕我直言,这应该是完全可以解析的。
如何修复该前向声明和结构本身?
问题在于数组声明符可能没有不完整的类型作为元素类型(C11 6.7.6.2/1)。和t_yash
(i.e. struct yhash_s
) 直到结构定义的右大括号才完成。
这条规则还负责另一个琐事;这是合法的(在结构定义完成之前):
void func( t_yhash *a );
但不合法拥有:
void func( t_yhash a[] );
即使如果不是不完整的元素类型规则,调整规则也可以正常工作。
也许可以通过细化此规则以允许某些情况(例如函数原型)来稍微改进语言设计,但这显然不是语言设计委员会提出的。
但即使没有这条规则,您的用例也可能会遇到另一个问题;指针的大小可能未知。 “指向结构体 X 的数组的指针”与“指向结构体 Y 的数组的指针”具有不同的大小是合法的(尽管实际上不太可能)。有一个规则是所有指向结构体的指针必须具有相同的大小,但对于指向数组的指针则没有这样的规则。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)