在分析mDNS源码时遇到这样一句代码:
#if defined(_LP64) || defined(__LP64__)
typedef signed int mDNSs32;
typedef unsigned int mDNSu32;
#elif defined(_ILP64) || defined(__ILP64__)
typedef signed int32 mDNSs32;
typedef unsigned int32 mDNSu32;
#else
typedef signed long mDNSs32;
typedef unsigned long mDNSu32;
#endif
这句程序是用来将程序移植到64位平台时在32位和64位程序之间共享和读取数据的,就此段而言:就是在64位和32位下都将mDNSs和mDNSu定义为32位的数据。
为了方便理解这里给出了数据模型:
32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64"数据模型。
现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。
TYPE LP32 ILP32 LP64 ILP64 LLP64
CHAR 8 8 8 8 8
SHORT 16 16 16 16 16
INT 16 32 32 64 32
LONG 32 32 64 64 32
LONG LONG 64 64 64 64 64
POINTER 32 32 64 64 64