我有一个使用win32编写的 c ++ 代码。就其使用的数据类型而言:
原语(int, double, float, bool, long
,...)
Windows数据类型(INT, SHORT, LONG, BOOL, BYTE, WCHAR
,...)
以及其他几种数据类型:__int64
和wchar_t
问题:
我。要将此代码移植到 Linux ,我应该使用哪些数据类型?
II。或者,要使它成为跨平台(Linux和win32),这些数据类型是否与(i)中的数据类型不同?
提前致谢!
答案 0 :(得分:5)
当然,您应该使用该语言提供的数据类型。这些是基本数据类型,例如char
和int
。除此之外,请使用int8_t
标题中定义的int16_t
,<cstdint>
,...等。
关于BOOL
,请注意,如果我没记错的话,Windows的某些部分会将BOOL
定义为char
,而其他部分会使用int
。我认为甚至有些地方的数据类型TRUE
使用FALSE
和1
(resp。0
和BOOL
)以外的值。
因此,天真地将每个BOOL
更改为bool
以及每个WCHAR
更改为wchar_t
可能会导致出现意外情况,因为它会导致重载解决甚至以极大的方式破坏您的代码如果这些类型用于序列化。
我想到的另一件事是Window处理ASCII / Unicode的方式,所有这些TCHAR
可能最终为CHAR
或WCHAR
,具体取决于您的预处理器定义,所以你需要决定如何转移它们。
一些一般性建议:
不要滥用类型。例如,如果变量,参数和返回类型存储诸如句柄或指针之类的东西(例如int
,HINSTANCE
和这些类型的事物),则不要将它们定义为HWND
。而是为此定义一个有意义的类型,例如
using native_handle_t = HINSTANCE;
然后很容易为linux或其他平台提供替代定义,而无需搜索和更改整个代码库。
在序列化方面,例如,写入二进制文件时,您应该坚持使用固定大小的类型(uint8_t
,uint16_t
,...),因为它们在每个平台上都是正确的大小。在long
的大小为long
的平台上发送4
s的网络数据包,并在long
的大小为8
的平台上读取它们不一定是好事!
答案 1 :(得分:2)
阐述nh_关于BOOL
的答案。
Windows有3 Boolean types:
BOOL
是32位类型。 TRUE
和FALSE
定义指定基本值,但大多数返回BOOL
的API都会记录为成功时返回非零,因此您应该只写BOOL succ = somefunc(); if (succ) {...}
。
BOOLEAN
是8位类型。 Window NT内核和NT API主要使用它,但多年来已经在各个地方泄露到Win32中。
VARIANT_BOOL
是COM / Automation中使用的16位类型。 VARIANT_FALSE
为0,VARIANT_TRUE
实际为-1(0xffff
)!
由于VARIANT_BOOL
的定义方式以及BOOL
的使用方式,您只应测试某些内容是否为假(与0比较)或使用if (x)
和/或if (!x)
风格表达......