从win32将c ++代码移植到Linux的数据类型

ekr*_*mer 1 c++ linux winapi

我有一个使用win32编写的c ++代码.就其使用的数据类型而言:

  1. 原语(int, double, float, bool, long,...)

  2. Windows数据类型(INT, SHORT, LONG, BOOL, BYTE, WCHAR,...)

  3. 以及其他几种数据类型:__int64和wchar_t

问题:

一世.要将此代码移植到Linux,我应该使用哪些数据类型?

II.或者,为了使它跨平台(Linux和win32),这些数据类型是否与(i)中的数据类型不同?

提前致谢 !

nh_*_*nh_ 5

当然,您应该使用该语言提供的数据类型.这些是基本数据类型,如char和int.除此之外,使用int8_t,int16_t等等,在<cstdint>标题中定义.

但是要注意BOOL,如果我没记错的话,Windows的某些部分定义BOOL为char,而其他部分则使用int.我认为,甚至有一些地方比其他值TRUE和FALSE(分别为1和0)与数据类型使用BOOL.

这样,天真地改变每一个BOOL到bool,每WCHAR到wchar_t当涉及到重载,甚至破坏你的代码了巨大方式如果使用序列化这些类型可能会导致意外.

我想到的另一件事是Window处理ASCII/Unicode的方式,所有这些TCHAR可能最终都是CHAR或者WCHAR,取决于你的预处理器定义,所以你需要决定如何传输这些.


一些一般建议:

不要滥用类型.例如,没有定义的变量,参数和返回值的类型int,如果他们店里的东西一样把手或指针(例如HINSTANCE,HWND和这些事情).而是为此定义一个有意义的类型,例如

using native_handle_t = HINSTANCE;
Run Code Online (Sandbox Code Playgroud)

因此很容易为linux或其他平台提供替代定义,而无需搜索和更改整个代码库.

当谈到系列化,如写的二进制文件,你应该坚持固定大小类型(uint8_t,uint16_t,...),因为它们是每个平台上大小合适的.发送网络数据包与long一个平台上S其中的大小long就是4和阅读他们一个平台,在这里上long的大小8并不一定是好事!