哪个跨平台预处理器定义?(__ WIN32__或__WIN32或WIN32)?

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__).

Visual C的宏

gcc的宏

您必须检查每个编译器的文档,以便能够在编译时检测差异.我记得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)