C++ 哪个跨平台预处理器定义?(uuu WIN32或uuu WIN32或WIN32)?

C++ 哪个跨平台预处理器定义?(uuu WIN32或uuu WIN32或WIN32)?,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,我经常看到\uuuuwin32,WIN32或\uuuuwin32。我假设这取决于所使用的预处理器(来自VisualStudio或gcc等的预处理器) 我现在是否必须先检查操作系统,然后再检查使用的编译器?我们在这里使用的是G++4.4.x、Visual Studio 2008和Xcode(我假设它又是一个gcc)和ATM,我们正在使用的是\uuuuuuuWin32\uuuuuu、\uuuuuuuApple\uu和\uuuLinux\uuuuuu不明白为什么要这样做。您可能必须记住在编译器的命令行

我经常看到
\uuuuwin32
WIN32
\uuuuwin32
。我假设这取决于所使用的预处理器(来自VisualStudio或gcc等的预处理器)


我现在是否必须先检查操作系统,然后再检查使用的编译器?我们在这里使用的是G++4.4.x、Visual Studio 2008和Xcode(我假设它又是一个gcc)和ATM,我们正在使用的是
\uuuuuuuWin32\uuuuuu
\uuuuuuuApple\uu
\uuuLinux\uuuuuu
不明白为什么要这样做。您可能必须记住在编译器的命令行上手动指定定义,但仅此而已。作为记录,VisualStudio的定义是(带一个下划线)而不是
\uuuWin32
。如果它没有定义,那么它就没有定义,也没关系。

我已经重新构建了我的答案。。。该死,编辑狂暴:P:

你不需要使用分词一。对于MacOSX、Linux和其他类似Unix的系统,您可能根本不需要使用它们

最流行的是(据谷歌所说的事实)是
\uWin32

你从来没有在源代码中“手工”定义它。它是通过以下方式之一定义的:
作为命令行预处理器/编译器标志(如
g++-D\u WIN32

或者它是由编译器本身预定义的(大多数Windows编译器预定义了
\u WIN32
,有时也预定义了
WIN32
\u WIN32
)——那么您根本不需要担心定义它,编译器完成了全部工作


我以前的回答是:

您不必“必须”做任何事情。这只是为了多平台兼容性。通常,所有Unix类(包括Linux、MacOSX、BSD、Solaris等)和其他POSIX平台的代码版本都是完全相同的,并且必须对Windows进行一些更改。因此,人们通常为Unix类编写代码,而只使用一些Windows(例如DirectX指令、Windows类文件路径…)介于
#ifdef_WIN32
#endif
之间的部分

如果您有一些部分,例如仅X-Window-system或仅MacOS,您可以使用类似于
#ifdef X_Window
#ifdef MacOS
的方法来执行类似操作。然后,您需要在编译时设置适当的预处理器定义(使用-D标志的gcc,例如
gcc-D\u WIN32


如果你不编写任何依赖于平台的代码,那么你就不需要关心这样一个
#ifdef,#else,#endif
块。而且大多数Windows编译器/预处理器AFAIK都预定义了一些符号,比如
\u WIN32
(据谷歌所言,最流行),
WIN32
\u WIN32\u
,等等。因此,在Windows上编译它,除了编译之外,您可能不需要做任何其他事情。

这取决于您尝试执行的操作。如果您的程序想要使用某些特定的函数,您可以检查编译器(例如,来自gcc工具链)。如果要使用某些特定于操作系统的函数(无论编译器如何,例如WINDOWS上的CreateProcess和unix上的fork),则可以检查操作系统(_WINDOWS、_unix_)

您必须检查每个编译器的文档,以便在编译时能够检测到差异。我记得gnu工具链(gcc)在C库()中有一些函数不在其他工具链上(例如Visual C)。这样,如果您想在商品之外使用这些函数,则必须检测到您正在使用GCC,因此必须使用的代码如下所示:

#ifdef __GNUC__
// do my gcc specific stuff
#else
// ... handle this for other compilers
#endif

叹气-不要依赖编译器任何东西-在Makefile中指定要构建的平台。简单地说,任何以u开头的东西都依赖于实现,不可移植


我曾经在一个非常大的项目上尝试过你的方法,在Sun-C++和GCC之间来回奔波,我们决定使用Makefile控件,而不是试图推断编译器将要做什么。

本文回答了你的问题:

  • (加上万一它消失)
这篇文章很长,包含了一些难以复制的表格,但要点如下:

您可以通过以下方式检测Unix风格的操作系统:

#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
    /* UNIX-style OS. ------------------------------------------- */

#endif
一旦您知道它是Unix,您就可以找到它是否是POSIX以及POSIX版本,其中包括:

#include <unistd.h>
#if defined(_POSIX_VERSION)
    /* POSIX compliant */
#endif
以及苹果的操作系统

#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
和非POSIX窗口,具有:

#if defined(_WIN64)
    /* Microsoft Windows (64-bit) */
#elif defined(_WIN32)
    /* Microsoft Windows (32-bit) */
#endif
全文列出了以下符号,并显示了哪些系统定义了它们以及定义它们的时间:
\uaix
\uuuuu APPLE
\uuuuu CYGWIN32
\uuuuu CYGWIN
\uuuu蜻蜓
\uuu FreeBSD,
\uuuu gnu-linux
>“代码><代码><代码>>,<代码><代码>>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu码><代码>,<代码><代码>>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu码码码码码码,uuuuuuuuuuuu码码码码码,uuuuuuuuuuuuuuuuuuuuuuuu码码码码码码码,
太阳
太阳
__《代码><代码><代码><代码>,<代码><代码>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz<代码>/代码><代码><代码>/代码>/代码><代码><代码><代码><代码>/代码><代码><代码>/代码>/代码>/代码>/代码><代码><代码><代码><代码><代码><代码><代码><代码><代码>/代码><代码><代码><代码><代码><代码><代码>/代码><代码>>\u WIN32
\uuuuWin32\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

一个()涵盖了检测编译器和编译器版本。它列出了以下几个符号:
>uuuu-clung.uuuu
>uuuuuuuuuuu-gnucuuuuuu-gnucuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<<代码><编码
<
#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
#if defined(__CYGWIN__) && !defined(_WIN32)
    /* Cygwin POSIX under Microsoft Windows. */
#endif
#if defined(_WIN64)
    /* Microsoft Windows (64-bit) */
#elif defined(_WIN32)
    /* Microsoft Windows (32-bit) */
#endif