1

我是 C++ 新手,我正在编写跨平台脚本,这是我需要帮助的部分:

#if defined(_WIN64) || defined(_WIN32) ||  defined(__WIN32__) || defined(__TOS_WIN__) ||    defined(__CYGWIN__) || defined(__CYGWIN32) || defined(__MINGW32__) || defined(__BORLANDC__) || defined(__WINDOWS__)
#define M_OS_WIN
#elif defined(__linux) || defined(__linux__) || defined(linux) || defined(__gnu_linux__) ||    defined(__GNUC__)
#define M_OS_LINUX
#else
#error "OS NOT SUPPORTED";
#endif

其中哪些是正确的值(已过时,我应该添加其他值)?

  1. 我需要 windows 部分与<conio.h>.
  2. 我需要 Linux 部分与 g++ 兼容(<unistd.h>并且<termios.h>应该可以工作)。
  3. MACOS g++ 兼容吗?(下面的行正确吗?);

    #elif defined(Macintosh) || defined(__APPLE__) || defined(__MACH__)

  4. 这是检查编译器是否为 MS Visual Studio 的正确方法#if defined _MSC_VER吗?

4

2 回答 2

4

SourceForge 上提供了为每个平台/系统/架构上的预编译器定义的所有当前(和过时)宏的集合。查看预定义编译器宏项目。

在我的跨平台项目中,我通常为每个用例提供一个自定义名称,并将其定义为:

#define OS_WINDOWS (defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) ...)

这样我的代码的其余部分只依赖于一个简单的

#include "configure.h" // defines OS_WINDOWS, etc.
#ifdef OS_WINDOWS
   // Windows-specific stuff here.
#endif
于 2011-06-22T17:04:32.963 回答
0

通常,每个编译器都会提供预定义的宏来确定平台。您应该搜索predefined macro特定的编译器。

例如:对于 MSVC,可以在此处找到预定义的宏

MACOS g++ 兼容吗?
是的,Apple 的 XCode 工具包附带的编译器基本上是 g++,但他们对它进行了一些修改。

(下面的行是正确的吗?

#elif defined(Macintosh) || defined(__APPLE__) || defined(__MACH__)

您还需要添加

#elif defined(macintosh) || defined(Macintosh) || defined(__APPLE__) || defined(__MACH__)

在这里专门检查一下。

这是检查编译器是否为 MS Visual Studio 的正确方法#if defined _MSC_VER吗?

是的,根据我上面给出的 MSVC 链接的预定义宏的例外情况。

它评估编译器版本号的主要和次要数字组件。主要编号是句点分隔的版本号的第一个组成部分,次要编号是第二个组成部分。例如,如果 的版本号Visual C++ compiler15.00.20706.01,则_MSC_VER宏的计算结果为1500。在Visual Studio 2010中,_MSC_VER定义为1600.

于 2011-06-22T17:10:58.760 回答