64位操作系统编码规范
一、Linux及Windows主要类型字节长度
类型 | 32位 | 64位 |
short | 2 | 2 |
int | 4 | 4 |
long | 4 | Linux:8 Windows:4 |
size_t | 4 | 8 |
void *(及其它指针) | 4 | 8 |
time_t | 8 | 8 |
float | 4 | 4 |
double | 8 | 8 |
二、不允许使用long型;
三、不允许把int强制转换为指针,反之亦然;下面是错误的:int i = (int )ptr; 或: void *ptr = (void *)s32Tmp;
四、不允许在不同类型的指针(有继承关系除外)进行强制转换,如:int *ipTmp; time_t *tpTmp = *ipTmp;是错误的;
五、强烈建议使用带长度的类型,如:SInt32/UInt64等;
六、必须使用%p打印指针,如printf(“this[%p]\n”,this);
七、强烈建议不要采用scanf,scanf非常危险,Format和参数类型不一致时,非常容易导致越界写。如果必须使用,则必须认真区别32和64位的操作系统整数长度的差别,需要时,分别针对32和64位编写代码;
八、如果编写动态链接库,必须加上–fPIC编译选项;
九、采用GCC编译器时,必须使用-Wlong-long、-Wformat -Wpointer-arith 来发现 64 位编译问题,并关注相关警告信息;
十、编译器指示宏定义
宏定义 | 描述 |
__linux__ | Linux操作系统,与Windows及其它类型操作系统区别 |
i386 | Linux操作系统,32位x86架构 |
x86-64(注意是减号) | Linux操作系统,64位x86架构 |
_WINDOWS_ | Windows操作系统,与其它操作系统区别 |
_X86_ | Windows操作系统,32位x86架构 |
__MacOSX__ | Apple OSX |
_posix_ | 符合POSIX规范,类Unix操作系统,包括Linux/IBM AIX/HPUS/Sun Solaris/Apple MacOSX等 |
十一、 宏使用说明:
l 我们的代码要求同时支持32位和64位版本;
l 尽量不要使用与架构相关的宏,如i386/ x86-64/_X86_/Win32等,在同一操作系统中,API一般与架构无关,这样可以让代码具有良好的移植性;
l 我们的软件主要在类Unix(符合POSIX规范,包括Linux)和Windows下运行,优先使用_posix_作为区别非windows操作系统;
l 如果对准备使用的类UNIX下系统调用(API)是否支持其它操作系统没有把握,可使用_posix_加以标记,待日后移植到其它操作系统时,再测试或修改;