首页 > 其他分享 >聊聊typedef

聊聊typedef

时间:2024-09-18 23:05:06浏览次数:7  
标签:typedef Func void char 聊聊 类型 指针

目录

typedef

历史的误会-typedef也许应该是typerename,typedef就是用来给类型重命名的

typedef功能

  • typedef可以一次指定多个别名
    typedef int A,B,C;
  • typedef 为函数起别名的写法如下
    typedef signed char (*fp)(void);
  • typedef 也可以用来为数组类型起别名
typedef int five_ints[5];
five_ints x = {11, 22, 33, 44, 55};

简化类型声明

C 语言有些类型声明相当复杂,比如下面这个
char (*(*x(void))[5])(void);

函数指针 :
typedef 返回值类型 ()(参数);
数组指针 :
typedef 返回值类型 (
)[];
右左法则说明:右左法则不是标准C里面的内容,它是从C标准的声明规定中归纳出来的语法.C标准的声明规则是用来解决如何创建声明.而右左法则是用来解决如何辨识一个声明
右左法则内容:首先从最里面的标识符看起,然后往右看,再往左看.每当遇到圆括号时,就掉转阅读方向.一旦解析完 圆括号内的所有内容,就跳出圆括号.重复这个过程直到整个声明解析完毕.

根据右左法则, x的右边是(void),说明x是函数.x的左边是*,说明x的返回值类型是指针.
下一层括号的右边是[5],说明是元素个数为5的数组指针,左边是*,说明元素类型是指针.
下一层括号的右边是(void),说明是函数,左边是char,说明返回值类型是char,即数组元素为char (*)void
所以它是一个函数名为x,参数列表为void, 返回值为 大小为5,类型为char (*)void的数组指针 的函数指针.

typedef 可以简化复杂的类型声明,使其更容易理解。首先,最外面一层起一个类型别名。

typedef char (*Func)(void);
Func (*x(void))[5];

这个看起来还是有点复杂,就为里面一层也定义一个别名。

typedef char (*Func)(void);
typedef Func Arr[5];
Arr* x(void);

上面代码就比较容易解读了。

  • x是一个函数,返回一个指向 Arr 类型的指针。
  • Arr是一个数组,有5个成员,每个成员是Func类型。
  • Func是一个函数指针,指向一个无参数、返回字符值的函数。

typedef与宏的区别

//区别1:
#define pINT int*
typedef int* PINT

PINT p1,p2; 
pINT p3,p4;

p2是什么类型,p4是什么类型?
答:p2是整型指针,p4是整型. 可以看出typedef和宏有一定差别,用typedef更容易理解,更安全
typedef后的类型应理解为定义了一种全新的类型,而不是像宏一样直接替换.

typedef的用法注意

  • typedef重命名后的类型,要注意正确使用修饰关键字
1.typedef后使用unsigned或signed可能会报错
typedef int INT;
int main() {
   unsigned INT b;  //error
}

2.const 

3.static

不要过度使用typedef

使用typedef本质上就是封装,在某些情况下,封装隐藏内部细节会给代码阅读带来成本.

为什么typedef属于存储类型关键字

typedef 的作用并不直接涉及存储管理或者变量的具体存储方式,而是用于给现有类型创建一个新的名称,即类型别名。

尽管如此,将 typedef 归类为存储类型关键字可能是因为在概念上它确实影响了类型在程序中的“存储”方式——存储在类型系统中而不是实际内存布局中。通过 typedef,程序员可以在不改变类型本质的情况下更改类型的名称,从而在类型层次上“存储”新的类型定义。这样做的目的更多是为了提高代码的可读性和可维护性,尤其是在处理复杂类型(如指针、数组、函数指针或结构体)时,赋予它们更具描述性的名称。

实际上,typedef 主要用于类型定义,而不直接影响变量的存储类别或持续性。它主要在编译阶段起作用,帮助编译器理解和解析类型,并不影响运行时的行为。

标签:typedef,Func,void,char,聊聊,类型,指针
From: https://www.cnblogs.com/DSCL-ing/p/18414573

相关文章

  • 聊聊事件循环
    事件循环>js是单线程,js引擎在执行时的原则:获取任务、执行任务。反复重复此过程,直到没有可执行的任务为止。任务分为同步任务和异步任务。异步任务分为宏任务和微任务。-js处理异步主要有微任务(microTask)和宏任务(macroTask),而从开始执行一个宏任务–>执行完这个宏任务中......
  • 聊聊企业驻场外包信息安全管理
    目前许多公司出于降本增效的考虑,大量使用服务外包的形式,通常根据外包人员是否入驻服务企业营业场所又可将外包分为驻场和非驻场两类。按照服务类型分又可以划分为安全服务类、开发测试类、咨询规划类、业务支持类等。一:驻场外包人员风险:数据泄露风险:外包人员可能由于培训不足缺......
  • 聊聊OceanBase合并和转储
    相比于Oracle、MySQL等传统的数据库,OceanBase数据库的存储引擎采用LSM-Tree的架构,这种存储引擎和之前所使用到的堆结构或B+树结构有很大的差别,今天我们就来聊聊LSM-Tree存储引擎所引入的合并和转储相关的功能特点。OB存储引擎的分层结构LSM-Tree存储引擎分为静态基......
  • C++ typedef 类型别名注意的地方
    指针、常量和类型别名如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名typedefchar*pstring;constpstringcstr=0;//cstr是指向char的常量指针constpstring*ps;......
  • 两年后的首更-聊聊甲辰龙年的云桌面
    昨天下午,和朋友一起沟通了两个小时,无意间,他提出了一个问题,现在云桌面的市场怎么样?我愣了一下,离开这个市场已经1年半了。 9月初,VmwareEUC的北京好友联系我,他们被收购后,后面也被裁员了,现在自由之身了。同样9月初,VmwarePS的朋友也告知我,他们估计要去伟仕佳杰,估计会接受降薪过去,未......
  • 简单聊聊 CORS 攻击与防御
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:霁明什么是CORSCORS(跨域资源共享)是一种基于HTTP头的机制,可以放宽浏览器的同源策略,实现不同域名网站之间的通信。前置知识同源定义:协......
  • GPIOMode_TypeDef 学习备注
    学习STM32——当需要用的GPIO引脚的时候往往要进行GPIO初始化,配置GPIO结构体函数。   GPIO初始化:   GPIO_InitTypeDefGPIO_InitStructure;              //定义结构体变量     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  ......
  • 十六年所思所感,聊聊这些年我所经历的 DevOps 系统
    作者:子丑前不久,我因为运动时的姿势不对,导致右腿骨折,喜提三个月的居家修养。按照作家刘震云的说法,这叫做着正确的事情,却迈着不正确的步伐。于是乎,我的活动空间骤减,每日除了短暂地楼下放风,便是卧坐于方寸之间。周遭静下来,许多回忆便涌了上来。从2008年开始,我陆陆续续参与了多个Dev......
  • 十六年所思所感,聊聊这些年我所经历的 DevOps 系统
    作者:子丑前不久,我因为运动时的姿势不对,导致右腿骨折,喜提三个月的居家修养。按照作家刘震云的说法,这叫做着正确的事情,却迈着不正确的步伐。于是乎,我的活动空间骤减,每日除了短暂地楼下放风,便是卧坐于方寸之间。周遭静下来,许多回忆便涌了上来。从2008年开始,我陆陆续续参与了多个Dev......
  • 十六年所思所感,聊聊这些年我所经历的 DevOps 系统
    作者:子丑前不久,我因为运动时的姿势不对,导致右腿骨折,喜提三个月的居家修养。按照作家刘震云的说法,这叫做着正确的事情,却迈着不正确的步伐。于是乎,我的活动空间骤减,每日除了短暂地楼下放风,便是卧坐于方寸之间。周遭静下来,许多回忆便涌了上来。从2008年开始,我陆陆续续参与了多个......