在c中键入定义不存在的结构

时间:2015-12-06 22:42:31

标签: c++ struct typedef

我目前正在学习指针和结构,我无法理解以下内容

typedef struct at atom;
struct at {
     int element = 5;
     struct at *next;
}

为什么这段代码不会抛出错误?

当我使用

创建一个原子时
atom x;
printf("%d", x.element);

它将打印5。

我不了解不存在的结构的类型定义,这是如何工作的?

3 个答案:

答案 0 :(得分:4)

typedef struct at atom;

在此,您声明一个名为struct的{​​{1}},并为其at提供typedef。所以这是完全有效的C.

atom

在这里,您定义您之前声明的结构struct at { int element = 5; struct at *next; }

注意:

重要的是要注意,在C中,不允许像在此处一样初始化结构中的变量:

at

然而,这在C ++中是完全可以的,所以如果您尝试使用C,请删除变量初始化,但如果您正在使用C ++,那么它就像它一样。< / p>

答案 1 :(得分:2)

这是一个前瞻性声明 - 在C中你可以声明一个命名的东西将存在,而不会提供有关它的详细信息,直到以后;最常见的用于允许知识循环;例如struct A指针指向struct Bstruct B指针指向struct Cstruct C指针指向struct A。在这种特定的情况下,只要你说事情都是结构,那么编译器就知道了类型,知道适当的指针是什么样的。

在这种情况下,您已声明会有一个名为at的结构,并且您希望将其称为atom。如果您在告诉编译器atom看起来是什么之前尝试声明struct at,那就错了。但在此之前,编译器有足够的信息可以继续。

答案 2 :(得分:1)

你忘了放一个分号

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;
};

比较thsi方法,例如函数。函数也可以多次声明,并且只定义一次。例如

void f();
void f();
//...
void f();

void f() { std::cout << "It is a joke" << std::endl; }

结构可以多次声明,但只定义一次。