<stdint.h> 的妙处
前言
在做课程设计的时候,有这样的一个代码片段:
1 | |
可以看到我使用了 uint32_t 数据类型,因此我得使用一个库 <stdint.h>,这个库中包含了 uint32_t 的定义。
但是我突发奇想,能不能自己定义:
1 | |
其实是不行的,因为这样写,在 64 位目标平台上编译出的代码可能是 32 位,在 32 位目标平台上编译出的代码可能就是 16 位,这样严重错误了(尽管我很明确我的机器是 64 位的,它不会出错,但不符合设计通用性)。
<stdint.h> 的做法
stdin.h 是这样做的:
1 | |
首先,判断编译器有没有定义__INT32_TYPE__,如果定义了,那么继续确认 glibc 是否定义 __int32_t_defined,如果没有定义的话,就定义 int32_t,否则就不定义了。虽然这里有点奇怪:它是用 __int8_t_defined 来判断是否定义 __int32_t_defined 的,因为一旦 glibc 将 __int8_t_defined 定义了,那么 __int32_t_defined 一定也是定义了的。
如果编译器定义了 __INT32_TYPE__,那么在判断 glibc 没有被包含后就自己定义;如果 glibc 被包含了,那么就没必要定义 int32_t 了,因为 glibc 已经被定义过了。后面的 uint32_t 定义过程也是如此。
这段代码的设计就是为了同时兼容有 glibc 和无 glibc 的环境,这样就可以保证安全地定义 uint32_t、int32_t了。
至于后面的宏定义,比如将 __int_least32_t 重新定义了一次,确保它是 32 位的。
<stdint.h> 的妙处
http://blog.luliang.online/2026/01/03/stdint_h/