What is the effect of typedef'ing a struct to itself?
我见过这个代码写在API的顶部:
1
| typedef struct SYSTEM SYSTEM; |
类型SYSTEM以前未定义。有人知道这是什么吗?在这行之后,编译器认为SYSTEM是什么?
谢谢你的回答!我的问题是系统以前没有在文件中定义,所以我不知道它是什么。例如,该行将自行编译,但没有在任何地方定义struct SYSTEM。
- 你把这个标记为c和c++。你在说这两种语言中的哪一种?
- 这里有一个很好的答案:stackoverflow.com/questions/612328/…
- 它是一个C API,但也适用于C++编译器。
- 你说的是struct SYSTEM是具体的还是一般的?SYSTEM只是一个例子,还是您试图确定这个特定结构的用途?
- 谢谢,我的意思是在这行代码之前的任何地方都没有定义"结构系统"。所以它编译,但我不知道系统(或结构系统)实际上是什么。
- @詹姆斯:如果在这一点之前(甚至在你直接或间接包含的标题中)没有定义struct SYSTEM,那么这一行就是一种转发声明。从这一点开始,SYSTEM将是一个不完整的类型,这意味着您只能声明指向它的指针(以及其他一些东西),但在完全定义它之前,您不能拥有此类型的变量。
这只在C语言中有效和有用。
在C中,您必须键入EDCOX1×9Ω,而C++允许您省略EDCOX1×10的一部分类型,只写EDCOX1×11Ω。
typedef struct type type允许您在C中使用type,而不必在结构名称之前使用struct关键字。
不过,有些C程序员认为这是一种糟糕的做法,他们更喜欢编写struct type。只是想把它放在外面。
您没有收到任何错误的原因是该行充当可能存在或可能不存在的EDOCX1[1]的转发声明。typedef所做的只是告诉编译器,当你说X时,你的意思是Y。
- 谢谢,但我的问题是,在任何地方定义结构系统之前,这一行是如何有效的?
- @詹姆斯,我已经更新了我的答案。那能回答你的问题吗?
它允许您在C中使用名称SYSTEM,而不是使用struct SYSTEM。typedef创建了SYSTEM与struct SYSTEM的同义词。
在您的情况下,由于struct SYSTEM未声明,声明还声明struct SYSTEM为不完整类型,如本声明中所述:struct SYSTEM;。
完整的对象类型struct SYSTEM可以在另一个翻译单元中声明。
- 谢谢,如上所述-没有在任何地方定义结构系统。
- @詹姆斯:你刚刚把它定义为——不完整的类型。
- @詹姆斯一世添加了一个编辑来覆盖你的评论。