4

我读到大多数程序员使用 typedef 来确保可移植性。

例如,当我写:

typedef int int16_t

typedef unsigned int uint16_t

只要 int16_t 与 int 相同(唯一的变化是名称),那么这里的可移植性在哪里?!为什么我不应该直接使用 int ?!

另一个问题:在不同的微控制器上,int 的大小不是恒定的,例如AVR 32int 的大小 = 4 字节,而AVR 8-bitint 的大小 = 2 字节

它取决于什么,为什么它会随着微控制器的变化而变化?!

4

3 回答 3

3

该类型的名称int16_t暗示您需要一个 16 位有符号整数。类型不是这样int;它的实现取决于编译器,而编译器又取决于平台。

因此,您可以typedef灵活地使用条件定义。

#ifdef PLATFORM_A
typedef int int16_t;
#else // any other platform
typedef short int16_t;
#endif

标准整数类型的位数通常取决于 CPU 寄存器的大小以及 CPU 和内存之间的数据总线的宽度。因此,通常,您可以假设 anint具有您的 CPU 可以处理的最有效大小。

于 2013-10-21T16:13:52.763 回答
3

类型的大小int不是由 C 精确指定的,它只应该至少等于 16 位。因此,在某些处理器架构上,编译器将其实现为 16 位,而在其他一些架构上实现为 32 位。因此,如果程序员编写int a,第一个架构需要 2 个字节,而第二个架构需要 4 个字节——即跨平台的不统一行为(考虑到“大小”方面缺乏可移植性)。

为避免这种情况,类型是使用类似uint_16uint_32在某些全局头文件(例如,types.h)中的名称来定义的。在 types.h 中,用户定义的类型将正确映射到合适的本机类型 - 考虑到您的示例,types.heg 中可能有特定于处理器的定义:-

#ifdef AVR_32
typedef unsigned int  uint_32
#else
typedef unsigned long uint_32  
#endif

稍后,程序员会使用这些类型(uint_16、uint_32 等),而不会自己关心大小。

于 2013-10-21T16:44:11.950 回答
1

可移植性上下文中的 typedef 通常用于带有条件编译的预处理器宏:

#if defined(INTEL_PROCESSOR)
typedef int my_desired_integer;
#elif defined(POWER_PC)
typedef long int my_desired_integer;
#elif defined(SOME_OTHER_WEIRD_PROCESSOR_OR_OS)
typedef short int my_desired_integer;
#endif

然后你my_desired_integer在你的代码中使用任何地方,预处理器将确保将正确的类型放入 typedef。

于 2013-10-21T16:14:30.670 回答