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 |
定义的宏取决于您将要使用的编译器。
正如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 /编译器对定义了宏表。
例如,您可以看到
无论如何,我发现这些表格非常丰富,我想我会在这里分享。