从不同的答案中可以看出,这个主题相当复杂。请记住,这是我最近将一些代码移植到三个平台(msvc 8/Windows、gcc 4.2/Linux、gcc 3.4/嵌入式 ARM9 处理器)时遇到的一些问题。它最初只能在 Visual Studio 2005 下编译。
a) 在 Windows 平台上编写的许多代码都使用 windows.h 中定义的类型。我必须创建一个“windows_types.h”文件,其中包含以下内容:
#ifndef _WIN32
typedef short INT16;
typedef unsigned short UINT16;
typedef int INT32;
typedef unsigned int UINT32;
typedef unsigned char UCHAR;
typedef unsigned long long UINT64;
typedef long long INT64;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef void * HANDLE;
typedef long LONG;
#endif
丑陋,但比修改以前仅针对 Windows 的代码要容易得多。
b) 在模板代码中不需要 typename 关键字来声明类型。 MSVC 在这方面很松懈(尽管我假设某些编译器开关会产生警告)。不得不在很多地方添加它。
c) 简单,但耗时:Windows 不区分大小写,许多#included 文件的大小写不正确会导致在 Linux 下出现问题。
d) 有相当多的代码使用 Windows API 来做很多事情。例如 CRITICAL_SECTIONS 和 INTERLOCKED_INCREMENT。我们尽可能使用 boost 库来解决这些问题,但重新编写代码非常耗时。
e) 很多代码依赖于包含在预编译头文件中的头文件。我们在 gcc3.4 上使用 pch 时遇到了问题,因此我们必须确保所有 .h/cpp 文件正确地包含它们的所有依赖项(因为它们应该首先具有)。
f) VS 2005 有两个讨厌的错误。允许将auto_ptr's can be assigned to anything 和临时变量传递给引用参数。两者都无法在 gcc 下编译(谢天谢地!),但需要返工。
g) 奇怪的是,我们的模板代码试图明确地专门化 class 模板函数。不允许。 gcc 再次拒绝,VS 2005 放手了。一旦理解了问题,就很容易将其返工为常规重载。
h) 在 VS 2005 下,允许使用字符串构造 std::exception。在 gcc 或标准下不允许。重新编写代码以更喜欢使用派生异常类之一。
希望这就是您正在寻找的信息!