Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C预处理器中可靠地检测Mac OS X、iOS、Linux和Windows?_C++_C_Cross Platform_C Preprocessor_Os Detection - Fatal编程技术网

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

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

如果有一些跨平台的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-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