我正在尝试转换在程序中广泛使用 DWORD、CString 和 BYTE 的 C++ 库,现在我正在将代码从 C++ Win32 库转换为 linux 程序。另外我正在使用 openSUSE 12.3 和 Anjuta IDE 来执行此操作,请帮助我应该使用哪些类型而不是提到的类型?我认为我应该将 unsigned int 用于 DWORD,将 string 用于 CString 和 unsigned char 而不是 BYTE 对吗?
4 回答
CString
不会直接转换为std::string
,但它是一个粗略的等价物。
BYTE
确实是unsigned char
并且DWORD
是unsigned int
。WORD
是unsigned 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;
会这样做。
我建议将 <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 类型很有用,您是否需要定义大小。
DWORD
=uint32_t
BYTE
=uint8_t
这些类型不是操作系统特定的,而是添加到 C++11 中的。你需要include <cstdint>
得到它们。如果你有一个旧的编译器,你可以使用 boost/cstdint,它只是头文件。
使用std::string
instead CString
,但您需要更改一些代码。
通过这些更改,您的代码应该可以在 Windows 和 Linux 上编译。
typedef unsigned long DWORD;
typedef unsigned char BYTE;
CString -> maybe basic_string<TCHAR> ?