【发布时间】:2015-12-06 22:42:31
【问题描述】:
目前正在学习指针和结构体,下面的看不懂
typedef struct at atom;
struct at {
int element = 5;
struct at *next;
}
这段代码怎么没有报错?
当我使用创建原子时
atom x;
printf("%d", x.element);
它将打印 5。
我不明白不存在结构的类型定义,它是如何工作的?
【问题讨论】:
目前正在学习指针和结构体,下面的看不懂
typedef struct at atom;
struct at {
int element = 5;
struct at *next;
}
这段代码怎么没有报错?
当我使用创建原子时
atom x;
printf("%d", x.element);
它将打印 5。
我不明白不存在结构的类型定义,它是如何工作的?
【问题讨论】:
typedef struct at atom;
在这里,您声明一个名为 at 的 struct 并给它一个 typedef 或 atom。所以这是完全有效的 C。
struct at {
int element = 5;
struct at *next;
}
在这里,您正在定义您之前声明的结构at。
注意:
需要注意的是,在 C 语言中,不允许像在此处那样初始化结构中的变量:
struct at {
int element = 5; // <---- Illegal in C
struct at *next;
}
但是,这在 C++ 中完全没问题,所以如果您尝试使用 C,请删除变量初始化,但如果您使用 C++,那么它就可以了。
【讨论】:
int element = 5;)。
这是一个前向声明——在 C 语言中,您可以声明一个命名事物将存在,而无需在稍后提供有关它的详细信息;这最常用于允许知识循环;例如struct A 有一个指向struct B 的指针,struct B 有一个指向struct C 的指针,struct C 有一个指向struct A 的指针。在那种特定的情况下,只要你说这些东西是结构,那么编译器就对类型有足够的了解,从而知道合适的指针是什么样的。
在这种情况下,您已声明将有一个名为at 的结构,并且您希望将其称为atom。如果您在告诉编译器 struct at 看起来像什么之前尝试声明 atom,那将是一个错误。但在此之前,编译器有足够的信息继续进行。
【讨论】:
你忘了放分号
typedef struct at atom;
struct at {
int element = 5;
struct at *next;
}
^^^^
考虑到它是 C++ 代码。在 C 中,您不能在其定义中初始化结构的数据成员。
此声明
typedef struct at atom;
声明了两件事。首先,它在当前声明区域中声明了新类型struct at。它为这种类型声明了一个别名atom
每个声明不必同时是一个定义。
首先声明struct at,然后定义
struct at {
int element = 5;
struct at *next;
};
将这种方法与函数进行比较。函数也可以被声明多次,并且只定义一次。例如
void f();
void f();
//...
void f();
void f() { std::cout << "It is a joke" << std::endl; }
同样的方式,一个结构可以被多次声明,但只能被定义一次。
【讨论】: