11-3. typedef关键词

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

1. 给整型类型取个别名

上一节中,我们讨论了预处理指令#define

它的使用公式如下:

#define 宏 替换体

一旦预处理器在程序中找到宏后,就会用替换体替换该宏

并且,我们示例了以下代码中的宏替换现象。

#include <stdio.h>

# define INTGER int
# define FMT "n1 = %d, n2 = %d, n3 = %d"
# define VAR n3

int main()
{
    INTGER n1, n2, n3;
    n1 = 1;
    n2 = 2;
    VAR = 3;

    printf(FMT, n1, n2, VAR);
    return 0;
}

替换宏

  1. INTEGER替换为int
  2. VAR替换为n3
  3. FMT替换为"n1 = %d, n2 = %d, n3 = %d"

宏的替换是无差别的,它仅仅把代码当做文本来处理,遇到宏就替换为宏对应的替换体。

我们现在把目光专注到宏INTEGER替换为int上。这种做法相当于给类型起了一个别名。

给类型起一个别名有什么意义呢?

还记得我们在整型数据类型中讨论过的,C语言标准并未规定这些数据类型的大小范围,具体的实现交由了编译器和平台决定。

也就是说,int在Visual Studio 2019中占用4字节大小,数据范围为-2147483648到2147483647。它也有可能在另一个平台上,仅占用2字节大小,数据范围为-32768到32767。

如果我们要求程序需要满足在不同的平台上均能正确的运行,不会因为整型数据范围不同而产生数据溢出。那么,我们可以为整型取一些别名。

在Visual Studio 2019:

整型类型 空间大小 别名
int 4 int32_t
short 2 int16_t
char 1 int8_t

另一个平台:

整型类型 空间大小 别名
long 4 int32_t
int 2 int16_t
char 1 int8_t

别名int32_t表示占用32位二进制、4字节的整型。在Visual Studio 2019中对应int类型。而在另一个平台中,int仅占2字节,long占4字节。所以,为了让大小保持对应。在另一个平台中,别名int32_t对应的类型为long

我们将整型类型使用别名替代,在不同平台下编译时,仅需要更改别名对应的实际类型,即可避免不同平台下,整型数据范围不同而产生数据溢出。