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;
}
- 宏
INTEGER
替换为int
。 - 宏
VAR
替换为n3
- 宏
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
。
我们将整型类型使用别名替代,在不同平台下编译时,仅需要更改别名对应的实际类型,即可避免不同平台下,整型数据范围不同而产生数据溢出。