8

我想用 C++ 编写一个包含系统调用的跨平台函数。我可以检查哪些条件编译标志来确定代码正在为哪个操作系统编译?我主要对使用 Visual Studio 和 GCC 的 Windows 和 Linux 感兴趣。

我认为它应该看起来像这样:

void SomeClass::SomeFunction()
{
    // Other code

#ifdef LINUX
    LinuxSystemCall();
#endif

#ifdef WINDOWS
    WindowsSystemCall();
#endif

    // Other code
}
4

4 回答 4

9

我的 gcc (4.3.3) 定义了以下与 Linux 相关的预定义宏:

$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

在 VC++(和许多其他 Win32 编译器)下,还有几个用于识别平台的预定义宏,最著名的是 _WIN32。更多详情: http: //msdn.microsoft.com/en-us/library/b0084kay (VS.80).aspx

于 2009-05-24T22:09:27.897 回答
8

没有标准的方法可以做到这一点。可以关闭每个平台定义的某些宏。例如,_WIN32 将在 Windows 上定义,几乎可以肯定不会在 Linux 上定义。但是我不知道任何相应的 Linux 宏。

因为您使用单独的编译器,所以您有单独的构建环境。为什么不自己添加宏?Visual Studio 和 GCC 都支持从命令行定义宏,所以只需定义它们。

于 2009-05-24T22:10:08.690 回答
7

我总是尝试通过这种方式将平台细节排除在主代码之外

平台.h:

#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif

someclass.c:

void SomeClass::SomeFunction()
{
   system_related_type t;
   // Other code
   platform_SystemCall(&t);
   // Other code
}

现在windows_platform.h,如果从一个平台到另一个平台的参数集差异太大,那么linux_platform.h您将 typedefsystem_related_type输入到本机类型,或者作为本机调用,或者创建一个小型包装函数。#define platform_SystemCall

如果特定任务的系统 API 在平台之间存在很大差异,您可能需要创建自己的版本 API 来区分差异。但在大多数情况下,Windows 和 Linux 上的各种 API 之间存在相当直接的映射。

我不是依赖某些特定的编译器#define 来选择平台,而是#define BUILD_PLATFORM xxx在项目文件或makefile 中,因为无论如何这些平台必须是唯一的。

于 2009-05-25T00:07:28.050 回答
0

这是我使用的。它在 Visual Studio 2008 和 MinGW 下工作:

#ifdef __GNUC__
  #define LINUX
#else
  #define WINDOWS
#endif

#ifdef WINDOWS
  #include "stdafx.h"
#else
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h>
  #include <ctype.h>
  #include <assert.h>
  #include <malloc.h>
#endif  
于 2010-06-30T16:46:41.077 回答