Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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_Struct_Typedef - Fatal编程技术网

C 什么';结构标签和花括号后面的区别是什么?

C 什么';结构标签和花括号后面的区别是什么?,c,struct,typedef,C,Struct,Typedef,有人能给我解释一下这段代码吗 typedef char AirportCode[4]; typedef struct NodeTag{ AirportCode Airport; struct NodeTag *link; }Node; Node *L; 这是我的数据结构类中的一段代码。这段代码用于在linkedlist节点中保存数据。我想了解的是NodeTag通常是用来做什么的?是不是因为缺少一个更好的词,你想让结构再进行一次迭代?NodeTag与花括号后面的内容有什么区别,在本例

有人能给我解释一下这段代码吗

typedef char AirportCode[4];

typedef struct NodeTag{
  AirportCode Airport;
  struct NodeTag *link;
}Node;

Node *L;

这是我的数据结构类中的一段代码。这段代码用于在linkedlist节点中保存数据。我想了解的是NodeTag通常是用来做什么的?是不是因为缺少一个更好的词,你想让结构再进行一次迭代?NodeTag与花括号后面的内容有什么区别,在本例中为“Node”?

您在这里将两个内容合并为一个:

(1) 结构声明:

struct NodeTag{
  AirportCode Airport;
  struct NodeTag *link;
};
这需要您像这样声明节点:

struct NodeTag *nt; 
结构定义的右大括号后面的任何内容都将声明该类型的变量

struct foo {int n;} a_global_variable;

使用(2)个
typedef

typedef ... Node;
这让你可以简单地说:

Node *n; 

但是,在struct声明中,由于
typedef
还不存在,因此您仍然必须说
struct NodeTag*nt
,而不是
Node*n

您在这里将两件事合并为一件:

(1) 结构声明:

struct NodeTag{
  AirportCode Airport;
  struct NodeTag *link;
};
这需要您像这样声明节点:

struct NodeTag *nt; 
结构定义的右大括号后面的任何内容都将声明该类型的变量

struct foo {int n;} a_global_variable;

使用(2)个
typedef

typedef ... Node;
这让你可以简单地说:

Node *n; 

但是,在struct声明中,由于
typedef
还不存在,因此在这样定义NodeTag而不是使用“struct NodeTag varName”来创建变量之后,仍然必须说
struct NodeTag*nt
而不是
Node*n

。所以它只是试图避免写“struct”关键字。@Martin我不认为这是一个真正的重复——这里的OP询问的是
NodeTag
Node
,而您建议的重复中的示例使用的是未命名的结构。如果有的话,建议的那个问题的答案()是一个更好的选择,除了它定义了C++,而不是C.,在定义了NoTeTeg之后,而不是使用“StuttNoDeTeValNeX”来创建一个变量,我们可以只使用“节点VALNEX”。所以它只是试图避免写“struct”关键字。@Martin我不认为这是一个真正的重复——这里的OP询问的是
NodeTag
Node
,而您建议的重复中的示例使用的是未命名的结构。如果有什么问题,建议的问题()的选择是一个更好的选择,除了它覆盖了C++而不是C。注意,在这种情况下,需要一些结构标记(这里是“代码> NoTebug”/代码>,因为结构定义是递归的。但是,对结构标记和类型别名使用相同的标识符是合法且常见的,例如
typedef struct Node{…}节点。在代码后期,它会。。。节点L,*温度;L=(节点)malloc(sizeof(节点));L->Link=NULL;temp=(Node*)malloc(sizeof(Node));L->Link=temp;如果L->link的类型为NodeTag,而temp的类型为Node,这怎么可能呢。我正在尝试实现类似于我正在开发的另一个程序的东西,我使用这段代码作为指导,我不断得到一个兼容性错误。@AndyStevenLlactahuamani,因为它们在技术上是相同的类型:)typedef只是一个别名机制。虽然您会收到警告,但您可能必须执行强制转换-因为作为程序员,您知道它们是相同的,这不是最佳做法,但您可以相应地进行强制转换。请注意,在这种情况下需要一些结构标记(这里,
NodeTag
),因为结构定义是递归的。但是,对结构标记和类型别名使用相同的标识符是合法且常见的,例如
typedef struct Node{…}节点。在代码后期,它会。。。节点L,*温度;L=(节点)malloc(sizeof(节点));L->Link=NULL;temp=(Node*)malloc(sizeof(Node));L->Link=temp;如果L->link的类型为NodeTag,而temp的类型为Node,这怎么可能呢。我正在尝试实现类似于我正在开发的另一个程序的东西,我使用这段代码作为指导,我不断得到一个兼容性错误。@AndyStevenLlactahuamani,因为它们在技术上是相同的类型:)typedef只是一个别名机制。虽然你会得到一个警告,这是有道理的,但是你可能必须进行强制转换——因为作为程序员,你知道它们是相同的,这不是最佳实践,但是你可以相应地进行强制转换。