在进行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. 机器学习实战:朴素贝叶斯算法在新闻文本数据上的分类表现
  2. 国际域名转出ICANN投诉
  3. 解决MathType与Word 2016兼容性问题。
  4. 如何实现网站文件动静分离
  5. Roguelike+RPG如何给玩家刺激的游戏体验? 《我功夫特牛》系统逆推
  6. 安装squid_「首席推荐」设置Squid转发代理或者正向代理
  7. 牛刀小试:使用Reactive Extensions(Rx),对短时间内多次发生的事件限流
  8. (实用工具分享)网页元素截图工具
  9. 物联网架构成长之路(22)-Docker练习之Etcd服务搭建
  10. HTML5和CSS3系列(四):常见样式、背景、Web字体、2D转换、过渡
  11. rfid卡的读写c语言,IC卡读卡器与编程语言
  12. MySQL数据库中防止SQL注入、防止脱库
  13. 非华为电脑多屏协同_升级版多屏协同,实现多窗口,华为电脑管家11.0版
  14. 成都车展:百度车联网的“阅兵”表演
  15. 致远oa mysql 安装_致远OA协同办公系统OA安装步骤.doc
  16. matlab绘制法线信息、矢量场
  17. 云止水中,但是风却不能停泊在海上
  18. Linux CreateRepo创建Repomd (xml-rpm-metadata)存储库
  19. 极速办公(PPT)如何修改文字为斜体
  20. 贵阳中天会展城A10大平层350平米户型装修设计效果图

热门文章

  1. 自定义error、北京污染物数据处理、可视化
  2. 证明:任意两个循环矩阵的矩阵乘法结果仍是循环矩阵
  3. 《基于Apache Flink的流处理》读书笔记
  4. WAlottery彩票软件简介
  5. python – 根据已有的数据进行预测未知数据
  6. xynuoj 灯光问题 酒馆浪人的博客
  7. 全球量子密匙分发设备行业收入预计2028年达到54.454亿美元
  8. 【离散数学】 SEU - 28 - 2021/06/11 - Lattice and Boolean Algebra
  9. 逻辑为基、数企赋能(NO.2)—逻辑关系
  10. java winrar_java 利用系统WinRAR解压缩(zip/rar压缩文件)