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

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

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


当前回答

#ifdef _WIN32
// do something for windows like include <windows.h>
#elif defined __unix__
// do something for unix like include <unistd.h>
#elif defined __APPLE__
// do something for mac
#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上的文档。

在大多数情况下,最好检查给定的功能是否存在。例如:pipe()函数是否存在。

在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/

使用#define OSsymbol和#ifdef OSsymbol OSsymbol是一个#define'able符号,用于标识目标操作系统。

通常,您将包含一个定义所选OS符号的中央头文件,并使用特定于OS的include和库目录来编译和构建。

你没有指定你的开发环境,但我很确定你的编译器提供了通用平台和操作系统的全局定义。

参见http://en.wikibooks.org/wiki/C_Programming/Preprocessor

没有根据C标准设置的标准宏。一些C编译器会在某些平台上设置一个宏(例如,苹果打了补丁的GCC设置了一个宏,以指示它正在苹果系统上编译,并用于Darwin平台)。你的平台和/或C编译器也可以设置一些东西,但没有通用的方法。

就像hayalci说的,最好在构建过程中设置这些宏。用大多数编译器定义宏是很容易的,而不需要修改代码。您可以简单地将-D MACRO传递给GCC,即。

gcc -D Windows
gcc -D UNIX

在你的代码中:

#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
#    error Unsupported operating system
#endif