我可以使用什么预定义宏来检测Clang中的目标架构?

ole*_*eks 6 macros arm clang

我想编写代码,具体取决于目标架构是armv7,armv7s还是arm64.

我不能使用sysctlbyname的原因是这会在运行时给我底层架构,但是当arm64例如模拟armv7时,sysctl(貌似)仍然报告arm64.

Bra*_*ram 11

虽然这不是问题的100%答案,但可能有用:

使用clang时,您可以使用以下方法识别32位手臂和64位手臂:

__arm__ 它定义为32位臂,仅限32位臂.

__aarch64__ 这是为64位臂和64位臂定义的.


小智 6

__ARM_ARCH_ISA_A64 如果目标是 arm64,则是预定义的,

__ARM_ARCH_7S__ 对于 armv7s,

__ARM_ARCH_7A__ 对于 armv7。

用途:clang -arch arm64 -E -dM - < /dev/null可以输出预处理宏。


小智 5

clang --target=... -mcpu=... -E - -dM </dev/null 将输出所有预定义的预处理器宏(gcc的工作原理也与此类似)

我没有看到一个宏给出了答案,但你也许可以使用一些组合__ARM_ARCHdefined(__ARM_ARCH_*)

  • `__ARM_ARCH` 同时支持 32 位和 64 位 ARM 机器。我相信布拉姆的答案更接近正确答案。 (2认同)