“typedef”如何使我的代码可移植?

时间:2013-10-21 15:59:11

标签: c embedded microcontroller avr

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

当我写作例如:

typedef int int16_t

typedef unsigned int uint16_t

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

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

它依赖于什么?为什么它会随着微控制器的变化而改变?!

3 个答案:

答案 0 :(得分:3)

类型int的大小并非由C指定,它应该至少等于16位。因此,在某些处理器架构上,编译器将其实现为16位,而在另一些处理器架构上实现为32位。因此,如果程序员写int a,它将在第一个架构上占用2个字节,在第二个架构上占用4个字节 - 即跨平台的非均匀行为(考虑到'大小'方面缺乏可移植性)。

为避免这种情况,在某些全局头文件(例如types.h)中使用uint_16uint_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。