int main(void)
{
struct a
{
struct b* x;
};
}
我将struct a
定义为包含指向x
的指针struct b
,而不定义struct b
。我期待一个错误。即使包括-Wall
,我也没有从编译器中获得任何东西。对此有解释吗?
答案 0 :(得分:2)
你拥有的是incomplete type,拥有这种类型的指针是完全没问题的,但除非你完成它,否则无法实例化。
2.7不完整类型
您可以在不列出的情况下定义结构,联合和枚举 他们的成员(或在枚举的情况下的价值观)。这样做 导致类型不完整。你不能声明变量 不完整的类型,但您可以使用指向这些类型的指针。
struct point { int x, y; };
稍后在您的程序中,您将需要完成该类型。 你可以像往常一样定义它:
struct singly_linked_list { struct singly_linked_list *next; int x; /* other members here perhaps */ }; struct singly_linked_list *list_head;
此技术通常用于链接列表:
$('#collapse3').click(function(e){ e.preventDefault(); $.ajax({ type: "GET", url:"<?php echo $plugin->dispatchRequest("saleshome/index",array('lat' => $latitude,'lng'=>$longitude)); ?>", data: { }, success: function(data){ $('#collapse3_res').html(data); } }); });
答案 1 :(得分:2)
这只是一种标准语言功能。 struct b
现在是一个不完整的类型。对于不完整类型,你可以做的不多。但是可以做的一件事就是声明指向不完整类型的指针。
稍后您可以通过提供struct b
的完整声明来完成该类型。之后它将成为正常的结构类型。
答案 2 :(得分:0)
因为编译器可以分配结构,因为它知道指针的大小,但你不能使用x
,因为除非有结构的定义,否则编译器不会知道如何取消引用指针。
您可以通过使用前向声明来利用此功能,您可以声明一个未知struct
类型的指针,并避免仅为结构包含可能的大型头文件,从而改进编译时间和精力。