在我的一堂C语言课上,老师使用的是struct而不是typedefstruct,当我尝试时,显示了一个错误,而这堂课没有显示任何错误
#include <stdio.h>
typedef struct {
char city[30];
int hno;
int pincode;
} address;
typedef struct {
char name[30];
int id;
int salary;
address a;
} employee;
int main(void) {
employee e;
scanf("%s %i %i %s %i %i", e.name, &e.id, &e.salary, e.a.city, &e.a.hno, &e.a.pincode);
printf("%s %i %i %s %i %i\n", e.name, e.id, e.salary, e.a.city, e.a.hno, e.a.pincode);
return 0;
}
而这个确实显示了一个错误,为什么呢?
#include <stdio.h>
typedef struct {
char name[30];
int id;
int salary;
typedef struct {
char city[30];
int hno;
int pincode;
} address;
address a;
} employee;
int main(void) {
employee e;
scanf("%s %i %i %s %i %i", e.name, &e.id, &e.salary, e.a.city, &e.a.hno, &e.a.pincode);
printf("%s %i %i %s %i %i", e.name, e.id, e.salary, e.a.city, e.a.hno, e.a.pincode);
return 1;
}
我的逻辑是不是
typedef struct {
// members of the structure
} name of the new variable;
声明了一个名为“新变量的名称”的新数据类型?
2条答案
按热度按时间gwbalxhn1#
正如我在评论中指出的,简洁的答案是:
你不能有嵌套的typedef。从语法上讲,
typedef
是一个存储类,你不能把一个存储类放在一个结构定义中。我认为最好参考C标准- §6.7声明作为一个整体,特别是§6.7.1存储类和§6.7.2.1结构和联合说明符。
根据§6.7.2.1,
struct-or-union-specifier
的语法是:在我转录的
-opt
作为后缀的地方,标准中有opt
作为下标,这意味着标记的元素是可选的。此规则的关键组件是
specifier-qualifier-list
,它可以由一个或多个type-specifier
项和一个或多个type-qualifier
项组成。您需要查看§6.7的其他部分,以发现§6.7.2定义:type-specifier
-基本类型,如int
和char
,以及更特殊的类型,如struct-or-union-specifier
。§6.7.3定义:
type-qualifier
-const
、restrict
、volatile
或_Atomic
之一。请注意,
typedef
不是这些项目之一。(请注意:typedef-name
出现在type-specifiers
的列表中,但这是一个标识符,而不是关键字typedef
。根据§6.7.1,项
storage-class-specifier
定义为:第5段说:
5 typedef说明符被称为“存储类说明符”只是为了语法上的方便;在6.7.8中进行了讨论。
因此,我在评论中使用了“语法上”这一限定词。
根据§6.7,声明的语法是:
在一般的
declaration
中,可以有一个storage-class-specifier
。2在声明中的声明说明符中最多只能给出一个存储类说明符,但
_Thread_local
可以与static或extern.120一起出现。脚注参考§6.11.5,其内容为:
将存储类说明符放置在声明中声明说明符的开头以外的位置是一个过时的功能。
因此,
typedef
(或extern
或static
等)应该首先出现在声明中。所有这些都表明,C语法不允许
typedef
出现在结构声明的中间,就像您在失败的示例中尝试做的那样。xj3cbfub2#
作为一个建议,你可以使用struct代替,像这样