C++ 数据类型移植到c++;从win32到Linux的代码
我有一个使用win32编写的c++代码。就其使用的数据类型而言:C++ 数据类型移植到c++;从win32到Linux的代码,c++,linux,winapi,C++,Linux,Winapi,我有一个使用win32编写的c++代码。就其使用的数据类型而言: 原语(int、double、float、bool、long,…) Windows数据类型(INT、SHORT、LONG、BOOL、BYTE、WCHAR,…) 还有一些其他数据类型:\uuu int64和wchar\u t 问题: 一,。要将此代码移植到Linux,我应该使用什么数据类型 二,。或者,要使其跨平台(Linux和win32),这些数据类型是否与(i)中的不同 提前谢谢 当然,您应该使用该语言提供的数据类型。这些是基本的
int、double、float、bool、long
,…)INT、SHORT、LONG、BOOL、BYTE、WCHAR
,…)\uuu int64
和wchar\u t
提前谢谢 当然,您应该使用该语言提供的数据类型。这些是基本的数据类型,如
char
和int
。除此之外,使用int8\u t
,int16\u t
。。。依此类推,在
标题中定义
当谈到BOOL
时要小心,不过,如果我没记错的话,有些窗口将BOOL
定义为char
,而其他部分则使用int
。我认为甚至在某些地方,除了TRUE
和FALSE
(分别是1
和0
)之外的值都与数据类型BOOL
一起使用
因此,天真地将每个BOOL
更改为BOOL
,将每个WCHAR
更改为WCHAR\u t
可能会在重载解析方面带来意外,如果这些类型用于序列化,甚至会极大地破坏代码
我想到的另一件事是Window处理ASCII/Unicode的方法,它使用所有这些TCHAR
s,根据预处理器的定义,它们可能最终成为CHAR
或WCHAR
,所以您需要决定如何传输它们
一些一般性建议: 不要误用类型。例如,不要将变量、参数和返回类型定义为
int
,如果它们存储诸如句柄或指针之类的内容(例如HINSTANCE
、HWND
,等等)。而是为此定义一个有意义的类型,例如
using native_handle_t = HINSTANCE;
这样就可以很容易地为linux或其他平台提供一个替代定义,而无需搜索和更改整个代码库
说到序列化,例如写入二进制文件,您应该坚持使用固定大小的类型(
uint8\u t
,uint16\u t
,…),因为它们在每个平台上的大小都是正确的。在long
大小为4
的平台上发送long
的网络数据包,并在long
大小为8
的平台上读取这些数据包,这不一定是件好事 当然,您应该使用该语言提供的数据类型。这些是基本的数据类型,如char
和int
。除此之外,使用int8\u t
,int16\u t
。。。依此类推,在
标题中定义
当谈到BOOL
时要小心,不过,如果我没记错的话,有些窗口将BOOL
定义为char
,而其他部分则使用int
。我认为甚至在某些地方,除了TRUE
和FALSE
(分别是1
和0
)之外的值都与数据类型BOOL
一起使用
因此,天真地将每个BOOL
更改为BOOL
,将每个WCHAR
更改为WCHAR\u t
可能会在重载解析方面带来意外,如果这些类型用于序列化,甚至会极大地破坏代码
我想到的另一件事是Window处理ASCII/Unicode的方法,它使用所有这些TCHAR
s,根据预处理器的定义,它们可能最终成为CHAR
或WCHAR
,所以您需要决定如何传输它们
一些一般性建议: 不要误用类型。例如,不要将变量、参数和返回类型定义为
int
,如果它们存储诸如句柄或指针之类的内容(例如HINSTANCE
、HWND
,等等)。而是为此定义一个有意义的类型,例如
using native_handle_t = HINSTANCE;
这样就可以很容易地为linux或其他平台提供一个替代定义,而无需搜索和更改整个代码库
说到序列化,例如写入二进制文件,您应该坚持使用固定大小的类型(uint8\u t
,uint16\u t
,…),因为它们在每个平台上的大小都是正确的。在long
大小为4
的平台上发送long
的网络数据包,并在long
大小为8
的平台上读取这些数据包,这不一定是件好事 详细说明s关于BOOL
的回答
Windows有:
是一种32位类型。BOOL
和TRUE
定义指定了基本值,但大多数返回FALSE
的API都记录为在成功时返回非零,因此您只需编写BOOL
BOOL succ=somefunc();如果(成功){…}
是一种8位类型。主要由windownt内核和NT-API使用,但多年来已在多个地方泄漏到Win32中BOOLEAN
是COM/Automation中使用的16位类型VARIANT\u BOOL
为0,而VARIANT_FALSE
实际上为-1(VARIANT_TRUE
)0xffff
VARIANT\u BOOL
是如何定义的,以及BOOL
是如何使用的,因此您应该只测试某个内容是否为假(与0相比),或者使用if(x)
和/或if(!x)
样式表达式…详细说明了作者关于BOOL
的答案
Windows有:
BOOL