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控件,而不是试图推断编译器将要做什么。本文回答了你的问题:
- (加上万一它消失)
#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