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

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

我认为这应该是这样的:

void SomeClass::SomeFunction() { // Other code #ifdef LINUX LinuxSystemCall(); #endif #ifdef WINDOWS WindowsSystemCall(); #endif // Other code } 

Solutions Collecting From Web of "基于操作系统的C ++条件编译"

我的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/zh-cn/library/b0084kay(VS.80).aspx

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

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

我总是试图通过这样做来保持主要代码的平台细节

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.hsystem_related_type键入为本机类型,并将#define platform_SystemCall作为本地调用,或者如果从一个平台设置为另一个平台的参数太不相同,则创建一个小包装函数。

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

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

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