好记性不如铅笔头

C && C++, 编程

【转】intptr_t、uintptr_t数据类型的解析

本文转自【 https://blog.csdn.net/cs_zhanyb/article/details/16973379

typedef  intptr_t      ngx_int_t;
typedef  uintptr_t    ngx_uint_t;

intptr_t和uintptr_t是什么类型?
这两个数据类型是ISO C99定义的,具体代码在linux平台的/usr/include/stdint.h头文件中。

该头文件中定义intptr_t和uintptr_t这两个数据类型的代码片段如下:

/* Types for `void *' pointers.  */
#if __WORDSIZE == 64
# ifndef __intptr_t_defined
typedef long int		intptr_t;
#  define __intptr_t_defined
# endif
typedef unsigned long int	uintptr_t;
#else
# ifndef __intptr_t_defined
typedef int			intptr_t;
#  define __intptr_t_defined
# endif
typedef unsigned int		uintptr_t;
#endif

64位的机器上,intptr_t和uintptr_t分别是long int、unsigned long int的别名。
32位的机器上,intptr_t和uintptr_t分别是int、unsigned int的别名。

那么为什么要用typedef定义新的别名呢?我想主要是为了提高程序的可移植性(在32位和64位的机器上)。很明显,上述代码会根据宿主机器的位数为intptr_t和uintptr_t适配相应的数据类型。
另外,如注释所言,定义这两个数据类型别名也是为了“void *”指针。在C语言中,任何类型的指针都可以转换为void *类型,并且在将它转换回原来的类型时不会丢失信息。

Leave a Reply

3 + 10 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据