为什么typedef可以区分定义语法?

问题描述 投票:0回答:3

typedef使用情况:

struct tagPOINT
{  
    int x;  
    int y;  
};  

typedef struct tagPOINT MyPoint;

MyPoint point = {1, 2};

您看到此行代码:typedef struct tagPOINT MyPoint;

为什么typedef可以区分代码,然后分成struct tagPOINTMyPoint,而不是structtagPOINT MyPoint

c typedef
3个回答
0
投票

为什么typedef可以区分代码然后分成struct tagPOINTMyPoint,而不是structtagPOINT MyPoint

因为这是typedef的工作方式。

语句的最后一个词MyPoint是您要定义的类型同义词,开始时的原义typedef词表明您正在执行类型定义,并且介于两者之间的所有内容都是您所定义的类型正在用来定义同义词。

这是珍妮特和约翰的解释,标准(C11 6.7.8 Type definitions)稍有详细,但是像大多数标准文件一样,它比较干燥,有时甚至超出您的需要。

如果您do想要标准文本:

typedef T type_ident;type_ident D;type_ident被定义为typedef名称,其类型由T中的声明说明符指定(称为T),并且D中的标识符具有类型derived-declaratortype-list T,其中derived-declarator-type-list为由D的声明者指定。

个人,我更喜欢可读的版本:-)


0
投票

typedef关键字用作语法中的存储类说明符:

typedef struct tagPOINT MyPoint;

换句话说,从句法上讲,它在短语结构中与externstatic占据相同的位置:

extern struct tagPOINT MyPoint;

在这里,我们有了基本的词组结构,这取决于我的记忆,而不是一个ISO文档:

<storage-class-specifier> <specifier-qualifier-list> <declarator> ;

[typedef是存储类说明符列表,struct tagPOINT是包括说明符限定符列表的类型说明符,MyPoint是声明符。

您的C编译器的解析器根据语法对所有这些信息进行分类。

换句话说,typedef不是某种命令语言中的某种命令,必须以某种ad hoc方式对其参数进行分析。


0
投票

在C语法中,在struct关键字之后可以出现的唯一标记是identifier

© www.soinside.com 2019 - 2024. All rights reserved.