如何在C预处理器中可靠地检测Mac OS X,iOS,Linux和Windows?

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

有大多数编译器使用的预定义的macros,你可以find列表[这里] 。 GCC编译器预定义的macros可以在这里find。 这里是一个gcc的例子:

#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 

这个定义的macros取决于你要使用的编译器。

_WIN64 #ifdef可以嵌套到_WIN32 #ifdef因为_WIN32是针对Windows定义的,而不仅仅是x86版本。 这可以防止代码重复,如果包括一些共同的两个。

正如Jake所指出的那样,TARGET_IPHONE_SIMULATOR是TARGET_OS_IPHONE的一个子集。

另外,TARGET_OS_IPHONE是TARGET_OS_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 

一种必然的答案: [本站]上的人花费了时间来为每个操作系统/编译器对定义macros表。

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

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