【问题标题】:Is it necessary to include <stdint.h> to guarantee portability of C99 new types?是否需要包含 <stdint.h> 以保证 C99 新类型的可移植性?
【发布时间】:2021-04-07 09:42:01
【问题描述】:
据我了解,uint32_t、uint_fast64_t、uintmax_t 等 C99 新类型在 <stdint.h> 中定义。但是,我注意到它们也在stdlib.h 中定义,并且从gnu.org 我发现它是检查的众多标头之一,但在其他网站中仅引用了<stdint.h>。
如果我使用这些类型,包括仅在我的实现中定义的<stdlib.h>,我的程序是否可以移植到其他平台,或者它无法工作,因为在另一台计算机上它们只在<stdint.h> 中定义?
我的猜测是,如果我从我的计算机为每个架构/操作系统编译程序,不会有任何问题,但是编译可能会从另一个失败,因为在那个特定的实现中,新类型只在另一个头文件中定义.
【问题讨论】:
标签:
c
types
portability
stdint
【解决方案1】:
是否需要包含 以保证 C99 新类型的可移植性?
是的,或者<inttypes.h>。并不是真的“保证可移植性”,而是包含<stdint.h> 以便随时在任何编译器中使用这些类型完全。请注意,uint32_t 和所有 intN_t 类型都是可选的 - 即使在包含 stdint.h 之后,它们也可能(可能...)不可用。
如果我使用这些类型,包括仅在我的实现中定义的 ,我的程序是否可以移植到其他平台,或者它不能工作,因为在另一台计算机上它们只在 ?
它无法工作。
可能会从另一个失败,因为在该特定实现中,新类型仅在另一个标头中定义。
是的。
从 gnu.org 我发现它是检查的众多标头之一
您引用的站点是关于用于构建 GCC 编译器的构建系统配置本身,它与编译程序时 GCC 提供的内容无关。 GCC 仅编译 for 二进制补码平台,您可以确定在使用 GCC 时stdint.h 将可用。