我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
当前回答
一些编译器会生成#定义来帮助你做到这一点。阅读编译器文档以确定它们是什么。MSVC定义了一个__WIN32__, GCC有一些你可以通过touch foo.h看到;gcc -dM foo.h
其他回答
在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
微软C/ c++编译器(MSVC)预定义宏可以在这里找到
我想你正在寻找:
_WIN32 -当编译目标是32位ARM、64位ARM、x86或x64时定义为1。否则,未定义的 _WIN64 -当编译目标是64位ARM或x64时定义为1。否则,未定义。
gcc编译器预定义宏可以在这里找到
我想你正在寻找:
__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
为预定义的适当编译器执行谷歌。
在大多数情况下,最好检查给定的功能是否存在。例如:pipe()函数是否存在。
你可以使用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 ?