在进行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位CPU,32位CPU与64位CPU里的长度一直为32位,因此在VC里DWORD一直可以用 无符号 long(即 unsigned long)类型来表示双字。在Linux系统里,大家用的编译器是GCC,long类型的长度是不定的,在32位操作系统里,sizeof(long)=4,在64位操作系统里,sizeof(long)=8,因此,在GCC里再用unsigned long来定义DWORD,则在x64系统里,应该是不正确的。

GCC编译器基本数据类型长度对照表

数据类型  GCC 32位 GCC 64位
sizeof(char) 1 1
 sizeof(double) 8 8
sizeof(float) 4 4
sizeof(int) 4 4
sizeof(short) 2 2
sizeof(long) 4 8
sizeof(long long) 8 8
sizeof(long double) 12 16
sizeof(complex long double) 16 32

而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位移植时可能会发送错误。

linux DWORD的正确定义相关推荐

  1. 怎么用linux的HDD存储,Linux学习的正确姿势12:Linux存储概览

    原标题:Linux学习的正确姿势12:Linux存储概览 从工作原理区分 机械 HDD 固态 SSD SSD的优势 SSD是摒弃传统磁介质,采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械 ...

  2. 如何用Linux的命令正确识别cpu的个数和核数

    如何用Linux的命令正确识别cpu的个数和核数 分类: 科学技术:分布式系统.算法数据结构.网络科学.机器学习等 2012-01-30 12:28 7786人阅读 评论(0) 收藏 举报 linux ...

  3. linux shell 自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  4. linux core 永久生效,【调试】Core Dump是什么?Linux下如何正确永久开启?

    内容简介 [调试]Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么? Core Dump乍听之下很抽象. 当 ...

  5. linux关闭计算机的命令是,关闭Linux计算机的正确命令和方法

    你想知道关闭Linux计算机的正确命令和方法么?下面是小编为大家收集的关闭Linux计算机的正确命令和方法,希望能帮到大家. 关闭Linux计算机的正确命令和方法 shutdown -h now 立即 ...

  6. 徐磊语法 6 7 时态的正确定义

    时态的正确定义 时:指时间状语 态:动作和时间状语之间的关系 决定态 (在前面,在后面) 在时间状语这一刻,动作已经是什么样子的.也就是跟时间状语的关系. 先通过时,确定时间状语的某一点,在通过态,告 ...

  7. linux machine start,Linux中的MACH定义之MACHINE_START / MACHINE_END

    (写在转载之前) 在linux中machine对应一个设备,对于开发者而言对应一个新的项目,项目开展的初始需要对应定义一个MACH,在arch/arm/mach-xxx/目录下,此文件中定义了GPIO ...

  8. linux 变量函数返回值,linux shell 自定义函数(定义、返回值、变量作用域)介绍...

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  9. 2-1若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于____。(1分)A.p++B.x++C.*(p++)D.x++作者往年试卷单位

    2-1 若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于____. (1分) A. p++ B. x++ C. *(p++) D. &x++ 作者 往年试卷 单位 浙江大学 ...

最新文章

  1. 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客
  2. linux python syslog,Centos下python 对syslog重写进行日志记录
  3. 基于Serverless的云原生转型实践
  4. 状态压缩 DP AHU420
  5. CF 335B. Palindrome(DP)
  6. 28335接两个spi设备_SPI浅析
  7. 力争营收渠道多样化,Line 向自拍应用 Snow 投资 4500 万美元
  8. 如何在Linux上使用netstat命令查证DDOS***
  9. VB.NET工作笔记004---查看电脑已经安装了哪些COM组件,可以用个OleViewer.zip
  10. android各版本的sdk区别
  11. 对比Hashtable、HashMap、TreeMap有什么不同(转)
  12. 查找算法之六 哈希查找(C++版本)
  13. HDL4SE:软件工程师学习Verilog语言(十)
  14. 开发人员的不断流动、让我们更加坚定信念,一定要控制好整个系统的底层架构、核心设计、日常质量检查工作
  15. TCP的三次握手和四次断开
  16. Unity3D游戏中隐藏鼠标光标
  17. 封头名义厚度如何圆整_封头规格
  18. 微信小程序聊天功能PHP,微信小程序实现聊天室
  19. Fast Fourier Convolution
  20. 国内常见的CPU品牌与架构

热门文章

  1. 神奇的Selinux Restore Rule
  2. 推荐系统笔记(十二):常用激活函数gelu、swish等
  3. 我就喜欢 6大N饭永不投诚经典语录
  4. 无名之辈-视觉脚本编译器开发
  5. 【Servlet】Servlet 详解(使用+原理)
  6. 计算机硬盘一直加载,Win10 64位电脑一直在频繁读取硬盘怎么办(已解决)
  7. docker自学入门
  8. 华为离职副总裁透露​年薪千万的工作感悟(建议收藏)
  9. python指定变量类型_Python-变量类型
  10. tlb tlh tli 关系