为什么struct x1{struct x1 stX};无法通过编译
来源:互联网 发布:毕业生户口迁移 知乎 编辑:程序博客网 时间:2024/05/01 06:07
在实际编程中,常常会遇到这样的问题:定义一个数据类型,而这个数据类型又包含此数据类型的变量。面对这个问题,通常的解决方法是把数据类型的变量定义为指针形式。例如二叉树结点的定义:
struct Node{//二叉树节点 int data;//节点数据 struct Node* leftChild;//节点左孩子 struct Node* rightChild;//节点右孩子}
上面的二叉树节点定义是正确的,可以编译通过。但是如果定义为如下对象形式,则无法编译通过:
struct Node{//二叉树节点 int data;//节点数据 struct Node leftChild;//节点左孩子 struct Node rightChild;//节点右孩子}
为什么采用指针形式可以通过编译,而采用上述的对象形式却不能编译通过呢?
原因在于C/C++采用的是静态编译模型。程序要正确地编译,编译器需要知道一个结构占用的空间有多大,除此之外,这类错误也成为结构的递归定义错误。
那为什么使用指针形式就可以了呢?
我们知道,指针的大小跟机器的字长有关,不管是什么类型,编译后指针的大小总是能够确定的,所以如果在32位机器上,指针的大小为4字节,则采用指针的形式,struct Node的大小在编译后就可以确定,为sizeof(int) + 4 + 4。而对于对象形式的struct Node定义,其长度在编译后是没有办法确定的。
所以,在编译过程中,要禁止类和结构的递归定义,以防产生奇怪的编译错误。
阅读全文
0 0
- 为什么struct x1{struct x1 stX};无法通过编译
- 声明 struct x1 { ...}; 和 typedef struct { ...} x2; 有什么不同?
- 如何通过X1使电脑上网
- ThinkPad X1
- 1x1
- os x1
- Struct
- struct
- struct
- struct
- Struct
- struct
- struct
- struct
- struct
- struct
- struct
- struct
- Maven学习总结(一)——Maven项目构建过程练习
- JAVA String.split()方法
- 【容斥原理】1717 题解
- Ural 1040 Airline Company(构造)
- O
- 为什么struct x1{struct x1 stX};无法通过编译
- 10种简单的Java性能优化
- Node.js——bower简明入门教程
- 34.笔记go语言——内建函数
- ResourceManager(八)—— 在安卓机子上实现加载AssetBundle
- vs的使用技巧
- web开发中实现会话跟踪
- verilog简单驱动sram
- 给你的大杀器装备核弹——Windows下安装使用GPU版XGBoot详细参考指南