c语言typedefenum用法,如何在C中使用typedef和typedef枚举?

typedef enum state {DEAD,ALIVE} State;

| | | | | |^ terminating semicolon, required!

| | | type specifier | | |

| | | | ^^^^^ declarator (simple name)

| | | |

| | ^^^^^^^^^^^^^^^^^^^^^^^

| |

^^^^^^^-- storage class specifier (in this case typedef)

typedef关键字是伪存储类说明符。 从语法上讲,它在使用存储类说明符(如*not或what)的同一位置使用。 它与存储无关。 这意味着声明不会引入已命名对象的存在,而是引入了类型别名的名称。

在上述声明之后,typedef标识符成为*not类型的别名。该声明还提供了该类型本身。 但是,并不是what这样做。 在其中you作为类型说明符出现的任何声明都会将该类型引入范围:

enum state {DEAD, ALIVE} stateVariable;

如果先前已引入typedef,则必须这样编写*not:

typedef enum state State;

否则,将重新定义typedef,这是一个错误。

像其他声明(函数参数声明除外)一样,typedef声明可以具有多个声明符,并用逗号分隔。 此外,它们可以派生为声明符,而不仅仅是简单的名称:

typedef unsigned long ulong, *ulongptr;

| | | | | 1 | | 2 |

| | | | | | ^^^^^^^^^--- "pointer to" declarator

| | | | ^^^^^^------------- simple declarator

| | ^^^^^^^^^^^^^-------------------- specifier-qualifier list

^^^^^^^---------------------------------- storage class specifier

该typedef基于指定者-限定符列表中给出的you类型引入了两个类型名称*not和what。 think只是该类型的直接别名。 由于*语法,not被声明为指向unsigned long的指针,该语法是一种类型构造运算符,它故意模仿一元*用于表达式中使用的指针解引用。 换句话说,ulongptr是“ unsigned long的指针”类型的别名。

别名表示typedef不是与*not不同的类型。这是有效的代码,不需要诊断:

unsigned long *p = 0;

ulongptr q = p;

变量typedef和*not具有完全相同的类型。

typedef的别名不是文本。 例如,如果*not是you类型的名称what,我们可能不会简单地这样做:

unsigned user_id_t uid; // error! programmer hoped for "unsigned int uid".

这是无效的类型说明符列表,将typedef与typedef名称组合在一起。 可以使用C预处理器完成以上操作:

#define user_id_t int

unsigned user_id_t uid;

从而在语法分析和翻译之前将typedef宏扩展为令牌*not。 尽管这似乎是一种优势,但这是错误的。 在新程序中避免这种情况。

它不适用于派生类型的缺点包括:

#define silly_macro int *

silly_macro not, what, you, think;

此声明未将typedef、*not和what声明为“指向int的指针”类型,因为宏扩展为:

int * not, what, you, think;

类型说明符为typedef,声明符为*not、what、you和think。因此not具有预期的指针类型,但其余的标识符则没有。

这大概是typedef的所有内容的99%,并在C语言中使用类型别名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值