C 语言编程 — typedef 关键字
【摘要】 目录
文章目录
目录typedef定义数据类型别名定义无名结构体
typedef 和 const 结合使用的陷阱
typedef
typedef 顾名思义,主要用于自定义一个数据类型,而数据类型在代码中的体现为 “名字”,所以 typedef 一般的理解是为一个数据类型或变量定义一个 别名。
定义数据类型别名
typedef unsigned ...
目录
typedef
typedef 顾名思义,主要用于自定义一个数据类型,而数据类型在代码中的体现为 “名字”,所以 typedef 一般的理解是为一个数据类型或变量定义一个 别名。
定义数据类型别名
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned int UINT32;
typedef signed char INT8;
typedef signed short INT16;
typedef signed int INT32;
typedef float FLOAT;
typedef double DOUBLE;
typedef char CHAR;
定义无名结构体
typedef struct
{ int a; char b; double c;
} Simple2;
上述例子中结构体是没有声明名字的,所以称之为 “无名结构体定义”。但 typedef 的存在,又让我们得到了一个 “别名”,实际上只是单存的在代码的书写上带来了便利而已。
typedef 和 const 结合使用的陷阱
#include <stdio.h>
typedef int* PINT;
int main(void)
{ int a = 23; const PINT b = &a; *b = 8; const int* c = &a; *c = 43; printf("the *b is %d\n",*b); return 0;
}
编译报错:
$ gcc test3.c -o test3
test3.c: 在函数‘main’中:
test3.c:13:5: 错误:向只读位置‘*c’赋值 *c = 43; ^
这个错误很好理解,因为整型常量 c 指向的数值是不可变的,所以为 “只读” 位置。
但为什么使用了语句 const PINT b = &a;
却不会编译错误呢?如果我们把编译错误的语句注释掉之后,程序甚至还可以执行:
$ ./test3
the *b is 8
从结果看出,我们预期的常量被修改了。实际上,我们应该把 const PINT b = &a
看成 int* const b = &a
,这条语句并非 “整型常量 b 被赋值了” 而是 “变量 b 的指针是一个常量,变量 b 被赋值了”。
这里就是陷阱了,当 typedef 和 const 结合使用时,尤其是在指针场景中,一律认为是定义一个指针常量,而非常量。下列两种写法其实是一致的:
const PINT b = &a;
PINT const c = &a;
如果我们非要这么使用的话,那么就用 typedef 将 const 一并声明了:
typedef const int* PINT;
PINT b = &a;
文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。
原文链接:is-cloud.blog.csdn.net/article/details/106865888
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)