我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

有办法做到这一点吗?有没有更好的方法来做同样的事情?


当前回答

我写了一个小的库来获取你所使用的操作系统,它可以使用clib (C包管理器)安装,所以将它作为项目的依赖项使用非常简单。

安装

$ clib install abranhe/os.c

使用

#include <stdio.h>
#include "os.h"

int main()
{
    printf("%s\n", operating_system());
    // macOS
    return 0;
}

它返回一个字符串(char*)与您正在使用的操作系统的名称,有关这个项目的进一步信息,请查看Github上的文档。

其他回答

操作系统的预定义宏站点有一个非常完整的检查列表。以下是其中的一些,以及它们所在位置的链接:

窗户

_WIN32 32位和64位 _WIN64仅支持64位 __CYGWIN__

Unix (Linux, *BSD,但不包括Mac OS X)

请参阅有关使用此检查的一些陷阱的相关问题。

unix __unix __unix__

Mac OS X

__APPLE__也用于classic __MACH__

两者都有定义;检查两者都可以。

Linux

__linux__ linux过时(不兼容POSIX) __linux过时(不兼容POSIX)

FreeBSD

__FreeBSD__

安卓

__ANDROID__

微软C/ c++编译器(MSVC)预定义宏可以在这里找到

我想你正在寻找:

_WIN32 -当编译目标是32位ARM、64位ARM、x86或x64时定义为1。否则,未定义的 _WIN64 -当编译目标是64位ARM或x64时定义为1。否则,未定义。

gcc编译器预定义宏可以在这里找到

我想你正在寻找:

__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__

为预定义的适当编译器执行谷歌。

在MinGW上,_WIN32定义检查不起作用。这里有一个解决方案:

#if defined(_WIN32) || defined(__CYGWIN__)
    // Windows (x86 or x64)
    // ...
#elif defined(__linux__)
    // Linux
    // ...
#elif defined(__APPLE__) && defined(__MACH__)
    // Mac OS
    // ...
#elif defined(unix) || defined(__unix__) || defined(__unix)
    // Unix like OS
    // ...
#else
    #error Unknown environment!
#endif

更多信息请浏览:https://sourceforge.net/p/predef/wiki/OperatingSystems/

我写了一个小的库来获取你所使用的操作系统,它可以使用clib (C包管理器)安装,所以将它作为项目的依赖项使用非常简单。

安装

$ clib install abranhe/os.c

使用

#include <stdio.h>
#include "os.h"

int main()
{
    printf("%s\n", operating_system());
    // macOS
    return 0;
}

它返回一个字符串(char*)与您正在使用的操作系统的名称,有关这个项目的进一步信息,请查看Github上的文档。

很抱歉外部的参考,但我认为它适合你的问题:

C/ c++提示:如何使用编译器预定义的宏检测操作系统类型