craters 发表于 2022-6-13 22:40:10

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

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

元始天尊 发表于 2022-6-13 23:02:40

宏的话就是字符串替换,处理宏的时机其实是真正编译之前。而typedef这个肯定是编译过程中处理的
宏主要是用于给常量/变量一个明确的语义,或者单纯为了减少重复代码,还有条件编译,打印日志啥的,用处杂一点;宏可以写的很高级
typedef这个就纯粹为了定义类型了

系统消息 发表于 2022-6-14 19:11:31

本帖最后由 系统消息 于 2022-7-4 23:35 编辑

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

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

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

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

        class 类名
        {
        public:
                typedef 类型 类成员作用域别名;
        private:
                typedef 类型 类私有作用域别名;
        };

        返回类型 函数名(参数列表)
        {
                typedef 类型 函数菊部作用域别名;
                if (条件)
                {
                        typedef 类型 菊部子作用域别名;
                }
                return 返回值;
        }
}

typedef 还有更强大的用法(与模板结合使用):
template <typename T, size_t S = 0>
struct XXX
{
        typedef T type;
        typedef T (*ptype);
        typedef T (&rtype);
};
template <typename T>
struct XXX<T, 0>
{
        typedef T type;
        typedef T *ptype;
        typedef T &rtype;
};
XXX<int, 666>::type xx1, xx2; // xx1 和 xx2 都是 长度为666的int数组。
XXX<int, 666>::ptype pxx1 = &xx1, pxx2 = &xx2; // pxx1 和 pxx2 都是 长度为666的int数组的指针。
XXX<int, 666>::rtype pxx1 = xx1, pxx2 = xx2; // pxx1 和 pxx2 都是 长度为666的int数组的引用。
页: [1]
查看完整版本: typedef的底层是不是还是由宏安装的