• C++ typedef详解


    typedef的用途

    1)定义一种类型的别名

    注意typedef并不是简单的宏替换,如下例所示:

    1 int main()
    2 {
    3     char *pa,pb;//声明了一个指向字符变量的指针pa,和一个字符变量pb
    4     pa = "hello";
    5     pb = "hello";//报错,不能将const char*类型的值赋给char类型的实体
    6     pb = 'h';//正常
    7     return 0;
    8 }

    再看以下示例:

    1 int main()
    2 {
    3     typedef char* PCHAR;
    4     PCHAR pa,pb;
    5     pa = "hello";
    6     pb = "hello";//正常
    7     pb = 'h';//报错,不能将char类型的值赋给PCHAR类型实体
    8     return 0;
    9 }

    可以看出,typedef char* PCHAR;之后,PCHAR是char类型的别名,
    PCHAR pa,pb;将pa,pb都定义成char
    类型。

    2)定义struct结构体别名
    我们知道,当声明一个结构体对象时,必须要带上struct,
    格式为:struct 结构体名 对象名;
    如下例所示:

    1 struct tagPOINT1
    2 {
    3     int x;
    4     int y;
    5 };
    6 struct tagPOINT1 p1;

    当我们用typedef定义struct的别名后,可以直接用 别名 对象名 来声明一个对象
    如下例所示:

    1 typedef struct tagPOINT1
    2 {
    3     int x;
    4     int y;
    5 }POINT;
    6 POINT p1;

    3)用typedef来定义与平台无关的类型。
    比如,某一平台支持int类型,而不支持long类型。
    则可以使用typedef定义一个支持类型的别名,程序中使用该别名声明变量。
    这样,我们使用极小的修改,typedef int REAL; 就可以实现类型的平台无关性

    标准库中广泛使用了这个技巧。

    4)为复杂的声明定义一个简单的别名
    如:typedef int (*A) (char, char);
    A是我们定义的别名,表示的是一个指向函数的指针,
    该函数有两个char类型的参数,返回一个int类型的值。
    则A类型的对象可以指向任何符合上述规则的函数。
    如下例所示:

     1 #include<iostream>
     2 using namespace std;
     3 typedef int (*A)(char,char);
     4 int fun0(char a,char b);
     5 int fun1(char a,char b);
     6 int main()
     7 {
     8     A a;
     9     a = fun0;
    10     a('a','b');
    11     a = fun1;
    12     a('a','b');
    13     return 0;
    14 }
    15 int fun0(char a,char b)
    16 {
    17     cout<<"fun0"<<endl;
    18     return 0;
    19 }
    20 int fun1(char a,char b)
    21 {
    22     cout<<"fun1"<<endl;
    23     return 0;
    24 }
    输出结果:
    fun0
    fun1

    typedef和#define的区别

    由前面的讲解,我们知道typedef和#define有本质的区别。
    typedef是一种类型别名,而#define只是宏定义。二者并不总是可以互换的
    如下例所示:

    1 typedef char *pStr1;
    2 #define pStr2 char *;
    3 pStr1 s1, s2;
    4 pStr2 s3, s4;

    其中s1, s2, s3是char*类型,而s4是char类型。

    typedef需要注意的事项

    我们看一下下面的示例:

    1 typedef char* pStr;
    2 const char* p1 = "hello";
    3 const pStr p2 = "hello";
    4 p1++;//正常
    5 p2++;//报错

    p1和p2都是常量指针,意思是指针指向的内容不能修改,而指针是可以修改的。
    那为什么p1++正常,而p2++报错呢。
    对于p1++,我们不用再解释了,因为常量指针是可变的。
    p2是我们定义的别名,而不是系统固有类型,编译器在编译时,会认为p2是常量,不可修改,
    所以p2++会报错。

  • 相关阅读:
    CF598E Chocolate Bar 题解 动态规划
    CF864E Fire 题解 背包DP
    用 程序 解决 windows防火墙 的 弹窗 问题
    windbg 使用与技巧
    bat 下 字符串拆分 类似 split 可以使用 for /f delims
    vs2013 在按F5调试时,总是提示 “项目已经过期”的解决方案
    代理与反向代理
    关于维护用户状态的一致性
    视频的裁剪后缩放功能。
    通信协议的设计
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/16553281.html
Copyright © 2020-2023  润新知