C语言typedef声明问题

C语言typedef声明问题

问题描述:

请问为什么第一种声明编译是通不过错的,第二种是正确的。
第一种:
typedef Node *List;//两者仅第一句不同
typedef struct LNode {
int Data[40];
struct LNode * Last;
} Node ;
第二种:
typedef struct LNode *List;
typedef struct LNode {
int Data[40];
struct LNode * Last;
} Node ;

typedef的格式:
typedef 【Type】 【Alias】;
其中【Type】必须是一种确定的类型例如int,【Alias】是你给这种类型取的别名;
而typedef Node* List;
这个语句中,Node* 不是一种明确的类型,所以会报错。
而struct关键字就告诉编译器这是指向一种用户定义结构体的指针,因此可以编译成功。

对于第一种:Node 为定义类型,所以会有错误生成;
对于第二种:struct LNode定义LNode为struct类型,C语言允许LNode这种结构体类型在之后定义的规则。

最开始的时候是不能直接用结构体名直接当作类型来声明结构体变量的,只能用 “struct + 结构体名” 来作为结构体变量类型。
所以,虽然现在可以直接用结构体名作为类型了,但是为了向下兼容。。。

5633275757041.42.2.24.42.4.2.

5633275757041.42.2.24.42.4.2.

5633275757041.42.2.24.42.4.2.

肯定啊,第一种本身就是一个变量了,
你见过,int a;a* b;
这是什么鬼,
反观第二种,它是种数据类型,当然可以,一个是变量,一个是类型