首页 > 其他分享 >C语言第20天,typedef关键词和条件编译

C语言第20天,typedef关键词和条件编译

时间:2022-10-01 12:56:08浏览次数:48  
标签:int32 typedef 20 int 别名 C语言 char 整型

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

相关文章