- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑:
#define MAXROW 20
#define MAXCOL 60
typedef State Grid[MAXROW+2] [MAXCOL+2]
typedef enum state {DEAD,ALIVE} State
如何在 C 语言中使用 typedef
和 typedef enum
?这部分代码的作用是什么?
最佳答案
typedef enum state {DEAD,ALIVE} State;
| | | | | |^ terminating semicolon, required!
| | | type specifier | | |
| | | | ^^^^^ declarator (simple name)
| | | |
| | ^^^^^^^^^^^^^^^^^^^^^^^
| |
^^^^^^^-- storage class specifier (in this case typedef)
typedef
关键字是一个伪存储类说明符。从句法上讲,它与使用 extern
或 static
等存储类说明符的位置相同。它与存储没有任何关系。这意味着声明不会引入命名对象的存在,而是引入类型别名的名称。
在上述声明之后,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
引入了两个类型名称 ulong
和 ulongptr
,基于 unsigned long
中给出的类型说明符限定符列表。 ulong
只是该类型的直接别名。 ulongptr
被声明为指向 unsigned long
的指针,这要归功于 *
语法,在这个角色中,它是一种类型构造运算符,它有意模仿表达式中使用的指针取消引用的一元 *
。换句话说,ulongptr
是“指向unsigned long
”类型的别名。
别名意味着 ulongptr
不是 unsigned long *
的不同类型。这是有效代码,不需要诊断:
unsigned long *p = 0;
ulongptr q = p;
变量 q
和 p
具有完全相同的类型。
typedef
的别名不是文本的。例如,如果 user_id_t
是 int
类型的 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;
此声明没有将what
、you
和think
声明为“pointer to int”类型,因为宏扩展是:
int * not, what, you, think;
类型说明符是int
,声明符是*not
、what
、you
和思考
。所以 not
具有预期的指针类型,但其余标识符没有。
这可能是关于 typedef
和 C 中类型别名的所有内容的 99%。
关于c - 我如何在 C 中使用 typedef 和 typedef 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20426716/
我是一名优秀的程序员,十分优秀!