在 C 语言中,使用相同的源代码来针对不同的处理器架构是很常见的(或者至少是可能的)。处理器架构以不同方式定义整数大小也很常见。为了提高代码可移植性并避免整数大小限制,建议使用 C 标准整数头。但是,我对它的实际实现方式感到困惑。
如果我编写了一个为 x86 编写的小 C 程序,然后决定将其移植到 8 位微 Controller ,微 Controller 编译器如何知道如何将“uint32_t”转换为其 native 整数类型?
编写 C 编译器时是否有一些映射要求?例如,如果您的编译器要兼容 C99,您需要有一个映射功能来将所有 uint32_t 替换为 native 类型?
谢谢!
最佳答案
通常<stdint.h>
包含相当于
typedef int int32_t;
typedef unsigned uint32_t;
选择适合当前机器的实际类型。
实际上,它通常比这复杂得多,有大量额外的辅助头文件和辅助预处理器宏,但效果是相同的:名称如 uint32_t
最终成为真正的类型名称,就像 typedef
定义的那样.
您问“如果您的编译器要兼容 C99,您需要具有映射功能吗?”,答案基本上是"is",但“映射功能”可以只是编译器编写者选择的特定类型在其分布式副本 stdint.h
中。 (为了回答你的另一个问题,是的,有多少个编译器就有多少个 <stdint.h>
的副本;没有一个主副本或任何东西。)
单方面评论。您说,“为了增加代码可移植性并避免整数大小限制,建议使用C标准整数头”。真正的建议是,当您有特殊要求时(例如具有精确类型的尺寸),请使用该 header 。如果出于某种原因您需要一个有符号类型,例如 32 位,那么无论如何,请使用 int32_t
来自stdint.h
。但大多数时候,你会发现像int
这样的“普通”类型。和long
都很好。请不要让任何人告诉您必须为声明的每个变量选择精确的大小,并使用 stdint.h
的类型名称。来声明它。
关于c - 在编译期间如何转换 <stdint.h> 中的标准整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439345/