像Cocoa中的__LP64__和__arm64__那样存在什么定义可以在编译时区分平台?他们在哪里或如何定义?

时间:2013-12-09 02:27:37

标签: ios objective-c c 64-bit clang

随着arm64作为iphoneos平台的标准体系结构的引入,在某些情况下,必须为特定于64/32体系结构的代码实现编译时条件。

如果你看一下CoreGraphics/CGBase.h以及一些流行的开源项目providing support for arm64,很明显你可以检查是否存在64位运行时:

#if defined(__LP64__) && __LP64__
...
#else
...
#endif

还可以专门检查arm64 中提到的#ifdef __arm64__ ... #else .... #endif (而不仅仅是64位运行时)

{{1}}

是否有针对这些定义的全面列表或文档?他们定义的地点或如何

2 个答案:

答案 0 :(得分:16)

这些宏并不特定于Cocoa,它们特定于CLANG,它们可以在命令行中列出:

clang -dM -E -x c /dev/null

不同的CLANG版本附带了不同数量的功能标记,可以在配置时打开和关闭,也可以根据运行编译器的平台和操作系统来打开和关闭。可以在testing headers中找到一个相当全面的列表,其中每个受支持的系统的变体也分散在测试目录中。每个文档的文档取决于该标志是特定于CLANG,还是在其链接的标准库之一中定义(例如__llvm__defined by CLANG,但__WCHAR_WIDTH__由LibC定义) 。由于这个原因,确实没有包含权威文档的综合列表。只要符合语言规范,不同的平台就可以略微不同地做事。

大多数有趣的公共Objective-C宏存在于Foundation/NSObjCRuntime.h底部附近的Foundation中。

答案 1 :(得分:1)

您可能会发现this list有用。

链接指向架构列表ifdef,here您可以找到指向其他列表的链接(用于编译器和平台检测)。