从win32

时间:2017-09-06 13:07:27

标签: c++ linux winapi

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

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

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

  3. 以及其他几种数据类型:__int64wchar_t

  4. 问题:

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

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

    提前致谢!

2 个答案:

答案 0 :(得分:5)

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

关于BOOL,请注意,如果我没记错的话,Windows的某些部分会将BOOL定义为char,而其他部分会使用int。我认为甚至有些地方的数据类型TRUE使用FALSE1(resp。0BOOL)以外的值。

因此,天真地将每个BOOL更改为bool以及每个WCHAR更改为wchar_t可能会导致出现意外情况,因为它会导致重载解决甚至以极大的方式破坏您的代码如果这些类型用于序列化。

我想到的另一件事是Window处理ASCII / Unicode的方式,所有这些TCHAR可能最终为CHARWCHAR,具体取决于您的预处理器定义,所以你需要决定如何转移它们。

一些一般性建议:

不要滥用类型。例如,如果变量,参数和返回类型存储诸如句柄或指针之类的东西(例如intHINSTANCE和这些类型的事物),则不要将它们定义为HWND。而是为此定义一个有意义的类型,例如

using native_handle_t = HINSTANCE;

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

在序列化方面,例如,写入二进制文件时,您应该坚持使用固定大小的类型(uint8_tuint16_t,...),因为它们在每个平台上都是正确的大小。在long的大小为long的平台上发送4 s的网络数据包,并在long的大小为8的平台上读取它们不一定是好事!

答案 1 :(得分:2)

阐述nh_关于BOOL的答案。

Windows有3 Boolean types

  • BOOL是32位类型。 TRUEFALSE定义指定基本值,但大多数返回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)风格表达......