关于c ++:如何在C预处理器中可靠地检测Mac OS X,iOS,Linux,Windows?

How to detect reliably Mac OS X, iOS, Linux, Windows in C preprocessor?

本问题已经有最佳答案,请猛点这里访问。

如果有一些跨平台的C / C ++代码应该在Mac OS X,iOS,Linux,Windows上编译,我如何在预处理器进程中可靠地检测它们?


大多数编译器都使用预定义的宏,您可以在此处找到列表。可以在此处找到GCC编译器预定义的宏。
这是gcc的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifdef _WIN32
   //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

定义的宏取决于您将要使用的编译器。

_WIN64 #ifdef可以嵌套到_WIN32 #ifdef中,因为在定位Windows时定义了_WIN32,而不仅仅是x86版本。如果某些包含对两者都是通用的,则可以防止代码重复。


正如Jake所指出的,TARGET_IPHONE_SIMULATOR是TARGET_OS_IPHONE的子集。

此外,TARGET_OS_IPHONE是TARGET_OS_MAC的子集。

所以更好的方法可能是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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


一种推论答案:[本站点]上的人员花时间为每个OS /编译器对定义了宏表。

例如,您可以看到_WIN32未在Windows上使用Cygwin(POSIX)定义,而它是在Windows,Cygwin(非POSIX)和MinGW上使用每个可用的编译器(Clang,GNU,Intel,等等。)。

无论如何,我发现这些表格非常丰富,我想我会在这里分享。