我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#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
其他回答
一些编译器会生成#定义来帮助你做到这一点。阅读编译器文档以确定它们是什么。MSVC定义了一个__WIN32__, GCC有一些你可以通过touch foo.h看到;gcc -dM foo.h
没有根据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
显示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
在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/
总结一下,这里有一些有用的链接。
GCC通用预定义宏 预定义的操作系统 MSDN预定义宏 多链接的NaudeaSoftware页面 维基百科! SourceForge的“用于标准、编译器、操作系统和硬件架构的预定义编译器宏的概述。” FreeBSD的“差异化操作系统” 各种预定义宏 libportable