我可以在 C 中将结构作为其自身结构的成员吗?
Can I have a Structure as member of its own structure in C?
我可以在 C 中以其自己的结构(递归结构)创建一个结构的实例吗(尽管我现在当然可以,因为这有点奇怪和棘手)?
喜欢:
int main(void)
{
struct type
{
char name[20];
char address[35];
struct type;
};
return 0;
}
当然,编译器给我警告:
warning: declaration does not declare anything
但是he/it让它通过并给我一个可执行程序。
因为我想用 C++ 编译器编译同一个程序,he/it 抛出了一个错误:
error: ‘main()::type::type’ has the same name as the class in which it is declared
所以问题是针对 C,而不是 C++。
- 我可以这样做,而不会对我的程序造成任何进一步和更深层次的问题吗?
- 我是否可能会使用此技术进入未定义或未指定的行为?
- 有什么理由不这样做吗(f.e。compilation/performance 的问题)?
提前致谢。
首先,struct type;
是前向声明,不是成员变量定义。其次,不,你不能这样做,你需要使用指针。
要使用一个结构,它必须被完全定义,定义必须结束(结束}
)才能使用。否则编译器不知道结构的完整大小,也不知道它有多大以及必须为结构实例保留多少内存。
但是要创建指向结构的指针,编译器只需要知道结构标记(type
在您的例子中)。那是因为指针的大小在编译时是已知的。那时不需要知道完整结构本身的大小。
我可以在 C 中以其自己的结构(递归结构)创建一个结构的实例吗(尽管我现在当然可以,因为这有点奇怪和棘手)?
喜欢:
int main(void)
{
struct type
{
char name[20];
char address[35];
struct type;
};
return 0;
}
当然,编译器给我警告:
warning: declaration does not declare anything
但是he/it让它通过并给我一个可执行程序。
因为我想用 C++ 编译器编译同一个程序,he/it 抛出了一个错误:
error: ‘main()::type::type’ has the same name as the class in which it is declared
所以问题是针对 C,而不是 C++。
- 我可以这样做,而不会对我的程序造成任何进一步和更深层次的问题吗?
- 我是否可能会使用此技术进入未定义或未指定的行为?
- 有什么理由不这样做吗(f.e。compilation/performance 的问题)?
提前致谢。
首先,struct type;
是前向声明,不是成员变量定义。其次,不,你不能这样做,你需要使用指针。
要使用一个结构,它必须被完全定义,定义必须结束(结束}
)才能使用。否则编译器不知道结构的完整大小,也不知道它有多大以及必须为结构实例保留多少内存。
但是要创建指向结构的指针,编译器只需要知道结构标记(type
在您的例子中)。那是因为指针的大小在编译时是已知的。那时不需要知道完整结构本身的大小。