我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#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__
其他回答
总结一下,这里有一些有用的链接。
GCC通用预定义宏 预定义的操作系统 MSDN预定义宏 多链接的NaudeaSoftware页面 维基百科! SourceForge的“用于标准、编译器、操作系统和硬件架构的预定义编译器宏的概述。” FreeBSD的“差异化操作系统” 各种预定义宏 libportable
你可以使用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++编译器(MSVC)预定义宏可以在这里找到
我想你正在寻找:
_WIN32 -当编译目标是32位ARM、64位ARM、x86或x64时定义为1。否则,未定义的 _WIN64 -当编译目标是64位ARM或x64时定义为1。否则,未定义。
gcc编译器预定义宏可以在这里找到
我想你正在寻找:
__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
为预定义的适当编译器执行谷歌。
你可以在编译时使用预处理器指令作为警告或错误检查,你根本不需要运行这个程序,只是简单地编译它。
#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()函数是否存在。