C++ 如何在C预处理器中可靠地检测Mac OS X、iOS、Linux和Windows?
如果有一些跨平台的C/C++代码应该在Mac OS X、iOS、Linux、Windows上编译,我如何在预处理器过程中可靠地检测它们?大多数编译器都使用预定义的宏,您可以找到列表。可以找到GCC编译器预定义宏。 以下是gcc的一个示例:C++ 如何在C预处理器中可靠地检测Mac OS X、iOS、Linux和Windows?,c++,c,cross-platform,c-preprocessor,os-detection,C++,C,Cross Platform,C Preprocessor,Os Detection,如果有一些跨平台的C/C++代码应该在Mac OS X、iOS、Linux、Windows上编译,我如何在预处理器过程中可靠地检测它们?大多数编译器都使用预定义的宏,您可以找到列表。可以找到GCC编译器预定义宏。 以下是gcc的一个示例: #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) //define something for Windows (32-bit and 64-bi
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
//define something for Windows (32-bit and 64-bit, this part is common)
#ifdef _WIN64
//define something for Windows (64-bit only)
#else
//define something for Windows (32-bit only)
#endif
#elif __APPLE__
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR
// iOS Simulator
#elif TARGET_OS_IPHONE
// iOS device
#elif TARGET_OS_MAC
// Other kinds of Mac OS
#else
# error "Unknown Apple platform"
#endif
#elif __linux__
// linux
#elif __unix__ // all unices not caught above
// Unix
#elif defined(_POSIX_VERSION)
// POSIX
#else
# error "Unknown compiler"
#endif
#如果已定义(WIN32)|已定义(WIN32)|已定义(WIN32)|已定义(WIN32)|已定义(NT)
//为Windows定义内容(32位和64位,此部分是通用的)
#ifdef_WIN64
//为Windows定义内容(仅64位)
#否则
//为Windows定义内容(仅限32位)
#恩迪夫
#埃利夫苹果__
#包括
#if TARGET_IPHONE_模拟器
//iOS模拟器
#elif TARGET_OS_IPHONE
//iOS设备
#elif TARGET_OS_MAC
//其他种类的Mac OS
#否则
#错误“未知苹果平台”
#恩迪夫
#埃利夫linux__
//linux
#elif ___; unix _;//上面未捕获的所有Unice
//Unix
#定义的elif(POSIX版本)
//POSIX
#否则
#错误“未知编译器”
#恩迪夫
定义的宏取决于要使用的编译器
\u WIN64
\ifdef
可以嵌套到\u WIN32
\ifdef
中,因为在针对Windows x64版本时甚至定义了\u WIN32
。如果某些标头包含对两者都是公用的,则可以防止代码重复
(另外,
WIN32
不带下划线允许IDE突出显示代码的正确分区)。正如Jake指出的,TARGET\u IPHONE\u SIMULATOR
是TARGET\u OS\u IPHONE
的一个子集
另外,TARGET\u OS\u IPHONE
是TARGET\u OS\u MAC
的一个子集
因此更好的方法可能是:
#ifdef _WIN64
//define something for Windows (64-bit)
#elif _WIN32
//define something for Windows (32-bit)
#elif __APPLE__
#include "TargetConditionals.h"
#if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR
// define something for simulator
#elif TARGET_OS_IPHONE
// define something for iphone
#else
#define TARGET_OS_OSX 1
// define something for OSX
#endif
#elif __linux
// linux
#elif __unix // all unices not caught above
// Unix
#elif __posix
// POSIX
#endif
2021年1月5日:由于@Sadap的评论,链接更新 这是一个必然的答案:上的人花时间为每个OS/编译器对定义宏表 例如,您可以看到,在使用Cygwin(POSIX)的Windows上没有定义
\u WIN32
,而它是为在Windows、Cygwin(非POSIX)和MinGW上使用所有可用的编译器(Clang、GNU、Intel等)进行编译而定义的
无论如何,我发现这些表格内容丰富,我想在这里与大家分享。@Paul,“代码应该在Mac OS X、iOS、Linux和Windows上编译”还有更多。。。它应该是
#如果TARGET_OS_IPHONE
而不是#ifdef
,因为TARGET_OS_IPHONE
在Mac上定义为0
。根据SourceForge,WIN32是为32位和64位版本的Windows定义的,那么,WIN64不应该放在WIN32之前吗?@jdnight yes\uuuuuu linux\uuuuu
是所有linux发行版上支持的宏,并非所有linux发行版都支持\uuuuu linux
,出于同样的原因,\uuuuuu unix\uuuuuuuuuuuu
也应该代替\uuuuuuu unix
,由于所有遵循unix指南的平台都支持\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,这里有一个更深入的描述,也添加了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,是否在\u WIN64
和\u WIN32
块中重复?如果它检测到\u WIN64
,它将跳过\u WIN32
一个,这可能是不可取的。类似的东西可能会更好。我的Linux只定义了\uuuu Linux\uuuuu
、\uu gnu\uu Linux\uuuuu
和Linux
,而不是\uu Linux
什么是#定义目标操作系统OSX 1
?Apple和OS X定义了自己的宏。链接已失效。@Lindydancer