Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型定义c中不存在的结构_C++_Struct_Typedef - Fatal编程技术网

C++ 类型定义c中不存在的结构

C++ 类型定义c中不存在的结构,c++,struct,typedef,C++,Struct,Typedef,我目前正在学习指针和结构,我无法理解以下内容 typedef struct at atom; struct at { int element = 5; struct at *next; } 为什么这段代码不会抛出错误 当我使用 atom x; printf("%d", x.element); 它将打印5 我不理解不存在结构的类型定义,它是如何工作的?这是一个向前的声明-在C语言中,你可以声明一个命名的东西将存在,而不需要在以后给出它的详细信息;这是最常见的用于允许知识循环

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

typedef struct at atom;
struct at {
     int element = 5;
     struct at *next;
}
为什么这段代码不会抛出错误

当我使用

atom x;
printf("%d", x.element);
它将打印5


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

这是一个向前的声明-在C语言中,你可以声明一个命名的东西将存在,而不需要在以后给出它的详细信息;这是最常见的用于允许知识循环的方法;e、 g.
struct A
的指针指向
struct B
struct B
的指针指向
struct C
struct C
的指针指向
struct A
。在这种特定的情况下,只要您说这些东西是结构,那么编译器就足够了解类型,从而知道适当的指针是什么样子


在本例中,您已经声明在处将有一个名为
的结构,并且希望将其称为
atom
。如果在告诉编译器
struct at
是什么样子之前试图声明一个
atom
,那将是一个错误。但在此之前,编译器有足够的信息继续进行。

这是一个正向声明-在C语言中,您可以声明命名的东西将存在,而不需要在以后给出它的详细信息;这是最常见的用于允许知识循环的方法;e、 g.
struct A
的指针指向
struct B
struct B
的指针指向
struct C
struct C
的指针指向
struct A
。在这种特定的情况下,只要您说这些东西是结构,那么编译器就足够了解类型,从而知道适当的指针是什么样子

typedef struct at atom;
在本例中,您已经声明在
处将有一个名为
的结构,并且希望将其称为
atom
。如果在告诉编译器
struct at
是什么样子之前试图声明一个
atom
,那将是一个错误。但在此之前,编译器有足够的信息继续进行

typedef struct at atom;
这里,您正在声明一个名为
at
struct
,并给它一个
typedef
atom
。这是完全有效的

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

注意:

需要注意的是,在C中,不允许像这里这样在结构中初始化变量:

struct at {
     int element = 5; // <---- Illegal in C
     struct at *next;
}
struct at{
int元素=5;//
在这里,您正在声明一个名为
at
struct
,并给它一个
typedef
atom
,因此这是完全有效的C

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

注意:

需要注意的是,在C中,不允许像这里这样在结构中初始化变量:

struct at {
     int element = 5; // <---- Illegal in C
     struct at *next;
}
struct at{

int element=5;//您忘记放置分号了

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

考虑到它是C++代码。在C中,您不能初始化其定义内的结构的数据成员。< /P> 本声明

typedef struct at atom;
声明两件事。首先,它在当前声明性区域中声明新类型
struct at
。并且它为该类型
atom

没有必要使每一项声明同时成为一项定义

首先声明位于
的结构,然后定义它

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; }
void f();
无效f();
//...
无效f();

void f(){std::cout您忘记放置分号了

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

考虑到它是C++代码。在C中,您不能初始化其定义内的结构的数据成员。< /P> 本声明

typedef struct at atom;
声明两件事。首先,它在当前声明性区域中声明新类型
struct at
。并且它为该类型
atom

没有必要使每一项声明同时成为一项定义

首先声明位于
的结构,然后定义它

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; }
void f();
无效f();
//...
无效f();

在C中,CX@ L3X不允许使用Stutt成员(<代码> int元素=5;< /C> >),但您可以这样做,但是C++中的C.@ L3X不允许Strut成员()初始化,您是正确的,但是,您可以这样做:C++。