基于操作系统的C++条件编译

11

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

我认为它应该像这样:

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

#ifdef LINUX
    LinuxSystemCall();
#endif

#ifdef WINDOWS
    WindowsSystemCall();
#endif

    // Other code
}
4个回答

10

我的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


4
在处理Win32 / Win64条件编译时有一个需要注意的地方 - 当编译为Win64时,您会发现_WIN32被定义了(!),因此在测试_WIN32之前,请先测试_WIN64。 - Bruce Ikin

8

没有标准的方法来做到这一点。可能可以根据每个平台定义的某些宏来进行密钥操作。例如,在Windows上将定义_WIN32,而在Linux上几乎肯定不是。但是,我不知道有任何相应的Linux宏。

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


我想要使用最常见的宏来完成这个,希望是编译器自己定义的默认值。看起来 _WIN32 和 linux 就足够了。 - sourcenouveau
1
当然,但那能在BSD和其他UNIX版本上运行吗?最好自己定义它(在makefile、构建系统等中)。如果你不满意,至少用像#ifdef _WIN32 #define PLATFORM "Windows" #endif这样的东西来保护你的代码,然后有#ifndef PLATFORM #error PLATFORM undefined - check your configuration # endif - plinth

7

我总是尝试通过这种方式将平台特定内容从主代码中分离出来。

platform.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.hlinux_platform.h中,您将system_related_type定义为本地类型,并将#define platform_SystemCall作为本地调用,或者创建一个小的包装函数(如果从一个平台到另一个平台的参数集有太大不同)。
如果特定任务的系统API在平台之间非常不同,则可能需要创建自己的版本API以分别处理。但是,在Windows和Linux上,各种API之间通常有相当直接的映射。
与其依赖某个特定的编译器#define来选择平台,我在项目文件或makefile中#define BUILD_PLATFORM xxx,因为这些必须按平台唯一。

假设 BUILD_PLATFORM 已经被定义。如果没有定义,那么 WINDOWS_BUILD 也很可能没有被定义,这个表达式将会返回 TRUE。代码应该更像这样: #if defined(BUILD_PLATFORM) && BUILD_PLATFORM == WINDOWS_BUILD - Dan

1

这是我使用的。它适用于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  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接