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

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

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


当前回答

显示GCC在Windows上的定义:

gcc -dM -E - <NUL:

在Linux上:

gcc -dM -E - </dev/null

MinGW中的预定义宏:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

在unix系统:

unix __unix__ __unix

其他回答

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

窗户

_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__

#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

你可以在编译时使用预处理器指令作为警告或错误检查,你根本不需要运行这个程序,只是简单地编译它。

#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
    #error Windows_OS
#elif defined(__linux__)
    #error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
    #error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
    #error Unix_OS
#else
    #error Unknown_OS
#endif

#include <stdio.h>
int main(void)
{
    return 0;
}

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

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

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