linux DWORD的正确定义
在进行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的正确定义相关推荐
- 怎么用linux的HDD存储,Linux学习的正确姿势12:Linux存储概览
原标题:Linux学习的正确姿势12:Linux存储概览 从工作原理区分 机械 HDD 固态 SSD SSD的优势 SSD是摒弃传统磁介质,采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械 ...
- 如何用Linux的命令正确识别cpu的个数和核数
如何用Linux的命令正确识别cpu的个数和核数 分类: 科学技术:分布式系统.算法数据结构.网络科学.机器学习等 2012-01-30 12:28 7786人阅读 评论(0) 收藏 举报 linux ...
- linux shell 自定义函数(定义、返回值、变量作用域)介绍
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...
- linux core 永久生效,【调试】Core Dump是什么?Linux下如何正确永久开启?
内容简介 [调试]Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么? Core Dump乍听之下很抽象. 当 ...
- linux关闭计算机的命令是,关闭Linux计算机的正确命令和方法
你想知道关闭Linux计算机的正确命令和方法么?下面是小编为大家收集的关闭Linux计算机的正确命令和方法,希望能帮到大家. 关闭Linux计算机的正确命令和方法 shutdown -h now 立即 ...
- 徐磊语法 6 7 时态的正确定义
时态的正确定义 时:指时间状语 态:动作和时间状语之间的关系 决定态 (在前面,在后面) 在时间状语这一刻,动作已经是什么样子的.也就是跟时间状语的关系. 先通过时,确定时间状语的某一点,在通过态,告 ...
- linux machine start,Linux中的MACH定义之MACHINE_START / MACHINE_END
(写在转载之前) 在linux中machine对应一个设备,对于开发者而言对应一个新的项目,项目开展的初始需要对应定义一个MACH,在arch/arm/mach-xxx/目录下,此文件中定义了GPIO ...
- linux 变量函数返回值,linux shell 自定义函数(定义、返回值、变量作用域)介绍...
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...
- 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++ 作者 往年试卷 单位 浙江大学 ...
最新文章
- 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客
- linux python syslog,Centos下python 对syslog重写进行日志记录
- 基于Serverless的云原生转型实践
- 状态压缩 DP AHU420
- CF 335B. Palindrome(DP)
- 28335接两个spi设备_SPI浅析
- 力争营收渠道多样化,Line 向自拍应用 Snow 投资 4500 万美元
- 如何在Linux上使用netstat命令查证DDOS***
- VB.NET工作笔记004---查看电脑已经安装了哪些COM组件,可以用个OleViewer.zip
- android各版本的sdk区别
- 对比Hashtable、HashMap、TreeMap有什么不同(转)
- 查找算法之六 哈希查找(C++版本)
- HDL4SE:软件工程师学习Verilog语言(十)
- 开发人员的不断流动、让我们更加坚定信念,一定要控制好整个系统的底层架构、核心设计、日常质量检查工作
- TCP的三次握手和四次断开
- Unity3D游戏中隐藏鼠标光标
- 封头名义厚度如何圆整_封头规格
- 微信小程序聊天功能PHP,微信小程序实现聊天室
- Fast Fourier Convolution
- 国内常见的CPU品牌与架构