美文网首页C/CPLUS
C++<第十二篇>:typedef用法

C++<第十二篇>:typedef用法

作者: NoBugException | 来源:发表于2022-01-19 21:43 被阅读0次

typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。
它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。

(1)typedef 的声明
typedef 数据类型 别名;
(2)为基本数据类型定义新的类型名

演示代码如下:

#include <iostream>

typedef long long INT_64;

using namespace std;

int main()
{

    INT_64 a = 3;

    cout << sizeof(a) << endl;

    return 0;
}

数据类型 long long 占用8个字节(64位),使用 INT_64 替换 long long 可以一目了然的知道 a 占用8个字节。

在标准库 stdint 中,已经定义了各种整数类型:

typedef signed char        int8_t;
typedef short              int16_t;
typedef int                int32_t;
typedef long long          int64_t;

用于区分该整数占用几个字节,在实际开发中,可以直接使用标准库中的类型:int8_t、int16_t、int32_t、int64_t,其中int8_t占用1个字节,int16_t占用2个字节,int32_t占用4个字节,int64_t占用8个字节。

我们还可以定义我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型,即:

typedef long double REAL;

在不支持 long double 的平台二上,改为:

typedef double REAL;

甚至还可以在连 double 都不支持的平台三上,改为:

typedef float REAL;

这样,当跨平台移植程序时,我们只需要修改一下 typedef 的定义即可,而不用对其他源代码做任何修改。

(3)为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称

以结构体为例,演示代码如下:

struct Point
{
    double x;
    double y;
    double z;
};

int main()
{

    struct Point point = { 10.0, 9.0, 0 };

    return 0;
}

在旧的C语言,定义 point 变量必须添加 struct 关键字,为了简化类型名称,使用 typedef 定义新的结构体类型:

struct XPoint
{
    double x;
    double y;
    double z;
};

typedef struct XPoint Point;

int main()
{

    Point point = { 10.0, 9.0, 0 };

    return 0;
}

还可以将 typedef 放在 struct 前面做进一步简化。

typedef struct Point
{
    double x;
    double y;
    double z;
};

int main()
{

    Point point = { 10.0, 9.0, 0 };

    return 0;
}
(4)为数组定义简洁的类型名称

演示代码如下:

typedef int INT_ARRAY_10[10];


int main()
{
    INT_ARRAY_10 arr = {1, 2, 3, 4, 5};

    for (size_t i = 0; i < 5; i++)
    {
        cout << arr[i] << endl;
    }

    return 0;
}
(5)为指针定义简洁的名称

[简单指针]

演示代码如下:

#include <iostream>
#include <string>

using namespace std;

typedef char* PCHAR;

int main()
{
    PCHAR pa;
    char a[] = "zhangsan";
    pa = a;

    for (size_t i = 0; i < strlen(a); i++)
    {
        cout << *pa++ << endl;
    }

    return 0;
}

[复杂指针]

假设有一个指向函数的指针,代码如下:

#include <iostream>
#include <string>

using namespace std;

int sum(int a, int b);

int main()
{
    int (*p)(int, int) = sum;

    int result = (*p)(3, 4);

    cout << result << endl;

    return 0;
}

int sum(int a, int b)
{
    return a + b;
}

我们认为 int (*p)(int, int) 是比较复杂的,需要使用 typedef 来简化,简化后的代码是:

#include <iostream>
#include <string>

using namespace std;

int sum(int a, int b);

typedef int (*P)(int, int);

int main()
{
    P p = sum;

    int result = p(3, 4);

    cout << result << endl;

    return 0;
}

int sum(int a, int b)
{
    return a + b;
}

这样就将

int (*p)(int, int) = sum; 

简化成了

P p = sum;
(6)typedef的陷阱

接下来看一个简单的 typedef 使用示例,如下面的代码所示:

typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);

在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?

答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。
因此,const PCHAR 中的 const 给予了整个指针本身常量性,也就是形成了常量指针char* const(一个指向char的常量指针)
即它实际上相当于char* const,而不是 const char*(指向常量 char 的指针)。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:

typedef const char* PCHAR;
int strcmp(PCHAR, PCHAR);

其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;

不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。

[本章完...]

相关文章

  • C++<第十二篇>:typedef用法

    typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,...

  • Typedef 用法

    转自:Typedef用法总结 不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C...

  • 代码注入

    typedef注意用法

  • typedef的用法总结

    typedef的用法总结转载 2015年02月28日 13:40:16 标签:c++ 373第一、四个用途 用途一...

  • typedef用法

    介绍 typedef在c语言中主要是用来声明数据类型的别名的,比如我们可以用来代替系统默认的类型名称,数组、字符串...

  • 2018-08-24

    1. C++ typedef 原声明:int (a[5])(int, char);使用typedef:typede...

  • C/C++关键字介绍

    一、 typedef typedef为C/C++的关键字,与auto、extern、mutable、static、...

  • typedef和typename

    一、typedef 用法:typedef 内置类型 别名 关键字typedef对内置类型、类类型等进行重命名,使用...

  • typedef

    typedef常见用法 1.常规变量类型定义 例如:typedef unsigned char uchar 描述:...

  • 日入一词_64:mimic

    By using the typedef facility, C++ makes the char special...

网友评论

    本文标题:C++<第十二篇>:typedef用法

    本文链接:https://www.haomeiwen.com/subject/eafdhrtx.html