友情链接检测659292,黑帽seo工具,外包员工强制辞退找谁赔偿,网络工程师培训大约多少钱在进行C语言程序移植时#xff0c;有时候要把Windows下的程序移植到Linux下#xff0c;在Windows平台上通常是用VC开发#xff0c;在Linux上通常使用GCC编译代码。在Windows平台上#xff0c;大家一般用VC来编译代码#xff0c;VC天然的整合了Windows SDK#xff0c;在VC… 在进行C语言程序移植时有时候要把Windows下的程序移植到Linux下在Windows平台上通常是用VC开发在Linux上通常使用GCC编译代码。在Windows平台上大家一般用VC来编译代码VC天然的整合了Windows SDK在VC里有一个数据类型DWORD它其实不是一个C语言内建的类型它是由typedef 创建的类型最早的定义是在Windows SDK定义的微软将它定义在windef.h文件里定义如下
typedef unsigned long DWORD; DWORD 的本意是定义一个双字类型double word在计算机里一个字节BYTE)是8位一个字是16位双字是32位。微软的VC的long 在16位CPU32位CPU与64位CPU里的长度一直为32位因此在VC里DWORD一直可以用 无符号 long即 unsigned long类型来表示双字。在Linux系统里大家用的编译器是GCClong类型的长度是不定的在32位操作系统里sizeof(long)4在64位操作系统里sizeof(long)8因此在GCC里再用unsigned long来定义DWORD则在x64系统里应该是不正确的。
GCC编译器基本数据类型长度对照表
数据类型 GCC 32位GCC 64位sizeof(char)11 sizeof(double)88sizeof(float)44sizeof(int)44sizeof(short)22sizeof(long)48sizeof(long long)88sizeof(long double)1216sizeof(complex long double)1632 而Linux里的GCC编译器整数类型 int 的长度无论是在32位CPU还是64位CPU上长度都是4因此为了移植代码尽量符合Microsoft的初衷在Linux相关C/C代码里应该如下定义DWORD类型
typedef unsigned int DWORD; 虽然在GCC里将DWORD定义为long在大多数情况下程序能够正常运行但也许在一些需要数据交互的情况下程序就不一定能够正常了例如将DWORD记录在文件里如果在64位操作系统里 将被存储64位数据在32位操作系统里将被存储32位数据因此可能会出现错误。 在以前的32位程序设计当中好多代码一直把DWORD 与指针类型互用例如CreateIoCompletionPort等函数在64位移植时可能会发送错误。