找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1318|回复: 2

typedef的底层是不是还是由宏安装的

[复制链接]
发表于 2022-6-13 22:40:10 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
既然是的那为何typedef前面不用加#,感觉它和宏的区别不大
回复

使用道具 举报

发表于 2022-6-13 23:02:40 | 显示全部楼层
宏的话就是字符串替换,处理宏的时机其实是真正编译之前。而typedef这个肯定是编译过程中处理的
宏主要是用于给常量/变量一个明确的语义,或者单纯为了减少重复代码,还有条件编译,打印日志啥的,用处杂一点;宏可以写的很高级
typedef这个就纯粹为了定义类型了
回复 赞! 靠!

使用道具 举报

发表于 2022-6-14 19:11:31 | 显示全部楼层
本帖最后由 系统消息 于 2022-7-4 23:35 编辑

裆燃不是啊,typedef和#define的区别可大了:
  1. #define PINT1 int *
  2. typedef int *PINT2;

  3. // 以下4个变量,其中 pi12 是 int 类型,其它3个均为 int * 类型。
  4. PINT1 pi11, pi12;
  5. PINT2 pi21, pi22;
复制代码

typedef 可以实现给数组类型和函数类型取别名,而#define不行。
  1. typedef int ARRTYPE[233];
  2. ARRTYPE arr; // arr 为 233 个 int 长度的数组
  3. typedef 返回值 调用约定 函数类型别名(参数声明);
  4. 函数类型别名 函数名; // 这是声明一个函数,其原型由typedef定义。
  5. 函数类型别名 *函数指针 = &函数名; // 这是定义一个函数指针变量。
  6. 函数类型别名 &函数引用 = 函数名; // 这是函数引用。
复制代码

还有 typedef 有作用域,#define 没有:
  1. typedef 类型 全局作用域别名;
  2. namespace 命名空间
  3. {
  4.         typedef 类型 命名空间作用域别名;

  5.         class 类名
  6.         {
  7.         public:
  8.                 typedef 类型 类成员作用域别名;
  9.         private:
  10.                 typedef 类型 类私有作用域别名;
  11.         };

  12.         返回类型 函数名(参数列表)
  13.         {
  14.                 typedef 类型 函数菊部作用域别名;
  15.                 if (条件)
  16.                 {
  17.                         typedef 类型 菊部子作用域别名;
  18.                 }
  19.                 return 返回值;
  20.         }
  21. }
复制代码

typedef 还有更强大的用法(与模板结合使用):
  1. template <typename T, size_t S = 0>
  2. struct XXX
  3. {
  4.         typedef T type[S];
  5.         typedef T (*ptype)[S];
  6.         typedef T (&rtype)[S];
  7. };
  8. template <typename T>
  9. struct XXX<T, 0>
  10. {
  11.         typedef T type;
  12.         typedef T *ptype;
  13.         typedef T &rtype;
  14. };
  15. XXX<int, 666>::type xx1, xx2; // xx1 和 xx2 都是 长度为666的int数组。
  16. XXX<int, 666>::ptype pxx1 = &xx1, pxx2 = &xx2; // pxx1 和 pxx2 都是 长度为666的int数组的指针。
  17. XXX<int, 666>::rtype pxx1 = xx1, pxx2 = xx2; // pxx1 和 pxx2 都是 长度为666的int数组的引用。
复制代码
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-21 23:00 , Processed in 0.030170 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表