我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
我需要我的代码根据它被编译的操作系统做不同的事情。我在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
有办法做到这一点吗?有没有更好的方法来做同样的事情?
当前回答
在大多数情况下,最好检查给定的功能是否存在。例如: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 ?
在大多数情况下,最好检查给定的功能是否存在。例如:pipe()函数是否存在。
微软C/ c++编译器(MSVC)预定义宏可以在这里找到
我想你正在寻找:
_WIN32 -当编译目标是32位ARM、64位ARM、x86或x64时定义为1。否则,未定义的 _WIN64 -当编译目标是64位ARM或x64时定义为1。否则,未定义。
gcc编译器预定义宏可以在这里找到
我想你正在寻找:
__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
为预定义的适当编译器执行谷歌。
#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
基于nadeaussoftware和Lambda Fairy的答案。
#include <stdio.h>
/**
* Determination a platform of an operation system
* Fully supported supported only GNU GCC/G++, partially on Clang/LLVM
*/
#if defined(_WIN32)
#define PLATFORM_NAME "windows" // Windows
#elif defined(_WIN64)
#define PLATFORM_NAME "windows" // Windows
#elif defined(__CYGWIN__) && !defined(_WIN32)
#define PLATFORM_NAME "windows" // Windows (Cygwin POSIX under Microsoft Window)
#elif defined(__ANDROID__)
#define PLATFORM_NAME "android" // Android (implies Linux, so it must come first)
#elif defined(__linux__)
#define PLATFORM_NAME "linux" // Debian, Ubuntu, Gentoo, Fedora, openSUSE, RedHat, Centos and other
#elif defined(__unix__) || !defined(__APPLE__) && defined(__MACH__)
#include <sys/param.h>
#if defined(BSD)
#define PLATFORM_NAME "bsd" // FreeBSD, NetBSD, OpenBSD, DragonFly BSD
#endif
#elif defined(__hpux)
#define PLATFORM_NAME "hp-ux" // HP-UX
#elif defined(_AIX)
#define PLATFORM_NAME "aix" // IBM AIX
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR == 1
#define PLATFORM_NAME "ios" // Apple iOS
#elif TARGET_OS_IPHONE == 1
#define PLATFORM_NAME "ios" // Apple iOS
#elif TARGET_OS_MAC == 1
#define PLATFORM_NAME "osx" // Apple OSX
#endif
#elif defined(__sun) && defined(__SVR4)
#define PLATFORM_NAME "solaris" // Oracle Solaris, Open Indiana
#else
#define PLATFORM_NAME NULL
#endif
// Return a name of platform, if determined, otherwise - an empty string
const char *get_platform_name() {
return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;
}
int main(int argc, char *argv[]) {
puts(get_platform_name());
return 0;
}
测试与GCC和叮当上:
Debian 8 窗口(MinGW) 窗口(Cygwin)