mat*_*ath 38 c++ macros c-preprocessor
我常常看到__WIN32,WIN32或者__WIN32__.我认为这取决于使用的预处理器(来自visual studio,或gcc等).
我现在必须首先检查os,然后检查使用过的编译器吗?我们在这里使用G ++ 4.4.x,Visual Studio 2008和Xcode(我假设它是gcc)和我们正在使用的ATM __WIN32__,__APPLE__和__LINUX__.
Cha*_*acy 40
本文回答了您的问题:
这篇文章很长,包括很难重现的表格,但这里的重点是:
你可以用以下方法检测Unix风格的操作系统
#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
/* UNIX-style OS. ------------------------------------------- */
#endif
Run Code Online (Sandbox Code Playgroud)
一旦你知道它是Unix,你可以找到它是POSIX和POSIX版本:
#include <unistd.h>
#if defined(_POSIX_VERSION)
/* POSIX compliant */
#endif
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令检查BSD派生系统:
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
#include <sys/param.h>
#if defined(BSD)
/* BSD (DragonFly BSD, FreeBSD, OpenBSD, NetBSD). ----------- */
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
和Linux:
#if defined(__linux__)
/* Linux */
#endif
Run Code Online (Sandbox Code Playgroud)
和Apple的操作系统
#if defined(__APPLE__) && defined(__MACH__)
/* Apple OSX and iOS (Darwin) */
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR == 1
/* iOS in Xcode simulator */
#elif TARGET_OS_IPHONE == 1
/* iOS on iPhone, iPad, etc. */
#elif TARGET_OS_MAC == 1
/* OS X */
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
Windows与Cygwin
#if defined(__CYGWIN__) && !defined(_WIN32)
/* Cygwin POSIX under Microsoft Windows. */
#endif
Run Code Online (Sandbox Code Playgroud)
和非POSIX Windows:
#if defined(_WIN64)
/* Microsoft Windows (64-bit) */
#elif defined(_WIN32)
/* Microsoft Windows (32-bit) */
#endif
Run Code Online (Sandbox Code Playgroud)
完整的文章列出了以下符号,显示在系统中定义它们,当:_AIX,__APPLE__,__CYGWIN32__,__CYGWIN__,__DragonFly__,__FreeBSD__,__gnu_linux,hpux,__hpux,linux,__linux,__linux__,__MACH__,__MINGW32__,__MINGW64__,__NetBSD__,__OpenBSD__,_POSIX_IPV6,_POSIX_MAPPED_FILES,_POSIX_SEMAPHORES,_POSIX_THREADS,_POSIX_VERSION,sun,__sun,__SunOS,__sun__,__SVR4,__svr4__,TARGET_IPHONE_SIMULATOR,TARGET_OS_EMBEDDED,TARGET_OS_IPHONE,TARGET_OS_MAC,UNIX,unix,__unix,__unix__,WIN32,_WIN32,__WIN32,__WIN32__,WIN64,_WIN64,__WIN64,__WIN64__,WINNT,__WINNT,__WINNT__.
一个相关的文章(archive.org链接)覆盖检测编译器和编译器版本.它列出了下列符号:__clang__,__GNUC__,__GNUG__,__HP_aCC,__HP_cc,__IBMCPP__,__IBMC__,__ICC,__INTEL_COMPILER,_MSC_VER,__PGI,__SUNPRO_C,__SUNPRO_CC用于检测编译器,以及__clang_major__,__clang_minor__,__clang_patchlevel__,__clang_version__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,__GNUC__,__GNUG__,__HP_aCC,__HP_cc,__IBMCPP__,__IBMC__,__ICC,__INTEL_COMPILER,__INTEL_COMPILER_BUILD_DATE,_MSC_BUILD,_MSC_FULL_VER,_MSC_VER,__PGIC_MINOR__,__PGIC_PATCHLEVEL__,__PGIC__,__SUNPRO_C,__SUNPRO_CC,__VERSION__,__xlC_ver__,__xlC__,__xlc__用于检测编译器版本.
INS*_*INS 15
这取决于你想要做什么.如果您的程序想要使用某些特定的函数(例如,来自gcc工具链),您可以检查编译器.如果要使用某些特定于操作系统的函数(无论编译器是什么 - 例如Windows上的CreateProcess和unix上的fork),您可以检查操作系统(_WINDOWS,__ unix__).
您必须检查每个编译器的文档,以便能够在编译时检测差异.我记得gnu工具链(gcc)在C库(libc)中有一些不在其他工具链上的函数(比如Visual C).这样,如果您想要使用商品以外的那些功能,那么您必须检测到您正在使用GCC,因此您必须使用的代码如下:
#ifdef __GNUC__
// do my gcc specific stuff
#else
// ... handle this for other compilers
#endif
Run Code Online (Sandbox Code Playgroud)