我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
当前回答
你可以使用Boost。Predef,其中包含针对目标平台(包括OS)的各种预定义宏(BOOST_OS_*)。是的,boost通常被认为是一个c++库,但这是一个与C一起工作的预处理器头文件!
这个库定义了一组编译器、体系结构、操作系统、库和其他版本号,这些信息来自它可以收集到的C、c++、Objective C和Objective c++预定义宏或在一般可用的头文件中定义的宏。这个库的想法源于一个提议,即扩展Boost Config库,以提供比它所支持的特性定义更多且一致的信息。以下是该简短提案的编辑版本。
例如
#include <boost/predef.h>
// or just include the necessary header
// #include <boost/predef/os.h>
#if BOOST_OS_WINDOWS
#elif BOOST_OS_ANDROID
#elif BOOST_OS_LINUX
#elif BOOST_OS_BSD
#elif BOOST_OS_AIX
#elif BOOST_OS_HAIKU
...
#endif
完整的列表可以在BOOST_OS操作系统宏中找到
Godbolt演示
参见如何从boost获得平台id ?
其他回答
很抱歉外部的参考,但我认为它适合你的问题:
C/ c++提示:如何使用编译器预定义的宏检测操作系统类型
显示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
使用#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
操作系统的预定义宏站点有一个非常完整的检查列表。以下是其中的一些,以及它们所在位置的链接:
窗户
_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__