C 语言编程 — typedef 关键字

举报
云物互联 发表于 2021/08/06 00:34:08 2021/08/06
【摘要】 目录 文章目录 目录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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。