我读到大多数程序员使用typedef来确保可移植性。
当我写作例如:
typedef int int16_t
typedef unsigned int uint16_t
只要int16_t与int相同(唯一的变化是名称),那么这里的可移植性在哪里?!为什么我不应该直接使用int?!
另一个问题:在不同的微控制器上,int的大小不是常数,例如,AVR 32
大小为int = 4字节,而在AVR 8-bit
中,int的大小= 2字节
它依赖于什么?为什么它会随着微控制器的变化而改变?!
答案 0 :(得分:3)
类型int
的大小并非由C指定,它应该至少等于16位。因此,在某些处理器架构上,编译器将其实现为16位,而在另一些处理器架构上实现为32位。因此,如果程序员写int a
,它将在第一个架构上占用2个字节,在第二个架构上占用4个字节 - 即跨平台的非均匀行为(考虑到'大小'方面缺乏可移植性)。
为避免这种情况,在某些全局头文件(例如types.h)中使用uint_16
或uint_32
等名称定义类型。在types.h中,用户定义的类型将被正确映射到合适的本机类型 - 并且types.h中可能存在特定于处理器的定义。例如考虑你的例子: -
#ifdef AVR_32
typedef unsigned int uint_32
#else
typedef unsigned long uint_32
#endif
稍后,程序员会使用这些类型(uint_16,uint_32等)并且不会对自己的大小感到烦恼。
答案 1 :(得分:2)
类型int16_t
的名称意味着您需要一个16位有符号整数。对于int
类型,情况并非如此;它的实现取决于编译器,而编译器又取决于平台。
所以你使用typedef
来获得使用条件定义的灵活性。
#ifdef PLATFORM_A
typedef int int16_t;
#else // any other platform
typedef short int16_t;
#endif
标准整数类型中的位数通常取决于CPU寄存器的大小和CPU与内存之间数据总线的宽度。因此,通常,您可以假设int
具有CPU可以处理的最有效大小。
答案 2 :(得分: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。