1.给整型类型取别名
原因:我们在整型数据类型中讨论过的,C语言标准并未规定这些数据类型的大小范围,具体的实现交由了编译器和平台决定。
也就是说,int在Visual Studio 2019中占用4字节大小,数据范围为-2147483648到2147483647。它也有可能在另一个平台上,仅占用2字节大小,数据范围为-32768到32767。
如果我们要求程序需要满足在不同的平台上均能正确的运行,不会因为整型数据范围不同而产生数据溢出。那么,我们可以为整型取一些别名。
我们将整型类型使用别名替代,在不同平台下编译时,仅需要更改别名对应的实际类型,即可避免不同平台下,整型数据范围不同而产生数据溢出。
2. typedef关键词
除了使用#define,C语言还提供了typedef关键词用于定义类型别名。
typedef int int32_t;
原来的变量名,就变成了这种类型的别名。这样,我们就成功定义int的别名int32_t。
#include<stdio.h>
int main()
{typedef int int32_t;
int32_t n=123;
printf("n=%d\n",n);
return 0;}
结果为n=123
3. typedef与#define的区别
1.typedef只能用于给类型取别名,不能用于值。
2.typedef由编译器解释,而不是预处理器。
3.typedef在某些情况下,比#define更合适。
4.#define可以为值设置一个别名,而typedef不行。
某些情况下,使用typedef更合适。例如:我们定义char*的别名为STR。声明两个这种类型的变量。
#define STR char*STR name1,name2;
若使用#define定义的别名,宏STR展开后,代码如下。
char*name1,name2;
这样,仅有name1的类型为char*,而name2的类型为char。
若需要两个char*的变量,应当这样声明。
char *name1,*name2;
若使用typedef定义别名,两个变量均为char*类型。
typedef char *STR;
STR name1 name2;
4.提高整型可移植性
整型类型的别名无需我们自己定义,编译器会根据本平台的整型范围大小,设置对应的别名。我们仅需包含头文件stdint.h,即可使用这些别名。
#include<stdint.h>
int main()
{int32_t n=123;
printf("n=%d\n",n);
return 0;}
最后,还有一个问题。函数printf的转换规范如何保证可移植性呢?
例如:在上面的代码中,使用了"%d"打印int32_t。若int32_t是整型int的别名,那么代码没有问题。
若int32_t是整型long的别名,那么应当使用%ld打印
我们需要编译器提供的另外一个头文件inttype.h。以Visual Studio 2019中为例,打开头文件inttype.h,可以找到如下定义。
#include<stdio.h>
#include<inttypes.h>
int main()
{int32_t n=123;
printf("n=%"PRId32"\n",n);
return 0;}
在Visual Studio 2019中,"n=%"PRId32"\n"会被替换为"n=%""d""\n",而相邻的字符串将会被拼接为一个字符串,即"n=%d\n"。
在int32_t是整型long的别名的平台下,"n=%"PRId32"\n"会被替换为"n=%""ld""\n",即"n=%ld\n"。
标签:int32,typedef,20,int,别名,C语言,char,整型 From: https://www.cnblogs.com/mmwl/p/16747069.html