完整的声明
通常,结构体可以使用以下几种方式进行声明:
前三种虽然可行,但实际中考虑到方便和实际数据结构的需要,都较少使用。对于使用了tag的声明,将来需要更多的该结构体变量时,可以简单的使用"struct tag var-list;"进行新的结构体变量声明,这比仅有var-list而没有tag的声明稍微方便了一些,但像第三种这样既有tag又有var-list的声明没有带来比第二种更多的任何好处,反倒显得不那么利索。
实际中使用比较多的是最后两种方式,它们定义了新的类型new_type,以后再有需要这些已经定义过新类型的结构体变量时,只需要像定义简单数据类型的变量一样使用"new_type var-list;"即可。
这里要说的是,第五种方式有比第四种方式更方便的一个情形是当new_type需要进行自引用时,例如:
原本是想创建类型名self-ref,但是,它不可能成功。因为member-list中的新的类型名self-ref在直到它被使用之前仍未被定义!
这时,使用第五种声明的方式就能很方便的解决这个问题:
现在,包含有自引用的新类型名self-ref就能被成功创建了。
不完整的声明
对于需要声明一些相互间存在依赖关系的结构,和自引用结构一样,至少有一个结构必须在另一个结构内部以指针的形式存在。但是需要先声明哪个结构呢?
答案是任意先声明哪个!但前提是使用不完整声明,即先声明一个作为结构标签的标识符。接下来将这个标签用在不需要知道这个结构长度的声明中,这样就完成了其中一个结构的声明。剩下的另一个就跟普通的结构完全一样了。例如: