gpt4 book ai didi

c - 我如何在 C 中使用 typedef 和 typedef 枚举?

转载 作者:太空狗 更新时间:2023-10-29 16:18:45 26 4
gpt4 key购买 nike

考虑:

#define MAXROW 20
#define MAXCOL 60
typedef State Grid[MAXROW+2] [MAXCOL+2]
typedef enum state {DEAD,ALIVE} State

如何在 C 语言中使用 typedeftypedef enum?这部分代码的作用是什么?

最佳答案

typedef enum state {DEAD,ALIVE} State;
| | | | | |^ terminating semicolon, required!
| | | type specifier | | |
| | | | ^^^^^ declarator (simple name)
| | | |
| | ^^^^^^^^^^^^^^^^^^^^^^^
| |
^^^^^^^-- storage class specifier (in this case typedef)

typedef 关键字是一个伪存储类说明符。从句法上讲,它与使用 externstatic 等存储类说明符的位置相同。它与存储没有任何关系。这意味着声明不会引入命名对象的存在,而是引入类型别名的名称。

在上述声明之后,State 标识符成为类型enum state {DEAD,ALIVE} 的别名。该声明还提供了该类型本身。然而,这不是 typedef 做的。 任何声明,其中 enum state {DEAD,ALIVE} 作为类型说明符出现,将该类型引入范围:

enum state {DEAD, ALIVE} stateVariable;

如果 enum state 之前已经被引入,那么 typedef 必须这样写:

typedef enum state State;

否则 enum 被重新定义,这是一个错误。

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

typedef unsigned long ulong, *ulongptr;
| | | | | 1 | | 2 |
| | | | | | ^^^^^^^^^--- "pointer to" declarator
| | | | ^^^^^^------------- simple declarator
| | ^^^^^^^^^^^^^-------------------- specifier-qualifier list
^^^^^^^---------------------------------- storage class specifier

这个 typedef 引入了两个类型名称 ulongulongptr,基于 unsigned long 中给出的类型说明符限定符列表。 ulong 只是该类型的直接别名。 ulongptr 被声明为指向 unsigned long 的指针,这要归功于 * 语法,在这个角色中,它是一种类型构造运算符,它有意模仿表达式中使用的指针取消引用的一元 *。换句话说,ulongptr 是“指向unsigned long”类型的别名。

别名意味着 ulongptr 不是 unsigned long * 的不同类型。这是有效代码,不需要诊断:

unsigned long *p = 0;
ulongptr q = p;

变量 qp 具有完全相同的类型。

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

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

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

#define user_id_t int
unsigned user_id_t uid;

由此 user_id_t 在语法分析和翻译之前被宏扩展为标记 int。虽然这看起来像是一种优势,但它是错误的。在新程序中避免这种情况。

它不能很好地用于派生类型的缺点包括:

 #define silly_macro int *

silly_macro not, what, you, think;

此声明没有将whatyouthink 声明为“pointer to int”类型,因为宏扩展是:

 int * not, what, you, think;

类型说明符是int,声明符是*notwhatyou思考。所以 not 具有预期的指针类型,但其余标识符没有。

这可能是关于 typedef 和 C 中类型别名的所有内容的 99%。

关于c - 我如何在 C 中使用 typedef 和 typedef 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20426716/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com