6

我正在尝试转换在程序中广泛使用 DWORD、CString 和 BYTE 的 C++ 库,现在我正在将代码从 C++ Win32 库转换为 linux 程序。另外我正在使用 openSUSE 12.3 和 Anjuta IDE 来执行此操作,请帮助我应该使用哪些类型而不是提到的类型?我认为我应该将 unsigned int 用于 DWORD,将 string 用于 CString 和 unsigned char 而不是 BYTE 对吗?

4

4 回答 4

12

CString不会直接转换为std::string,但它是一个粗略的等价物。

BYTE确实是unsigned char并且DWORDunsigned intWORDunsigned short

您绝对应该使用typedef actual_type WINDOWS_NAME;来修复代码,不要到处更换类型。我会添加一个名为“wintypes.h”之类的新头文件,并在使用“windows.h”的任何地方都包含它。

编辑评论:使用CString,它实际上取决于它的使用方式(以及代码是否使用 MS 所谓的“Unicode”或“ASCII”字符串)。我很想创建一个类CString,然后std::string在其中使用。其中大部分可以通过简单地调用等效std::string函数来完成,但有些函数可能需要更多的编程——同样,它确实取决于CString实际使用的成员函数。

因为LP<type>, 那只是指向 , 的指针<type>,所以typedef BYTE* LPBYTE;并且typedef DWORD* LPDWORD;会这样做。

于 2013-04-30T10:01:11.047 回答
2

我建议将 <stdint.h> 中的 uint32_t 和 uint8_t 用于 DWORD 和 BYTE,将普通 char * 或 const char * 用于字符串(或用于 C++ 的 std:string 类)。

可能最好的想法是对现有代码使用 typedef:

typedef unsigned char             BYTE;

这些可以很容易地改变。

如果您重写代码,使用 char、int、long 和 (u)intX_t 类型很有用,您是否需要定义大小。

于 2013-04-30T10:04:48.107 回答
2
  • DWORD=uint32_t
  • BYTE=uint8_t

这些类型不是操作系统特定的,而是添加到 C++11 中的。你需要include <cstdint>得到它们。如果你有一个旧的编译器,你可以使用 boost/cstdint,它只是头文件。

使用std::stringinstead CString,但您需要更改一些代码。

通过这些更改,您的代码应该可以在 Windows 和 Linux 上编译。

于 2013-04-30T10:09:18.120 回答
1
typedef unsigned long DWORD;
typedef unsigned char BYTE;

CString -> maybe basic_string<TCHAR> ?
于 2013-04-30T10:01:03.530 回答