What predefined macro can I use to detect the target architecture in Clang?
我想根据目标架构是否是例如来编写代码 armv7,armv7s或arm64。
我不能使用sysctlbyname的原因是,这将在运行时为我提供底层体系结构,但在arm64例如 模拟armv7,sysctl(看似)仍报告arm64。
-
为什么会有问题? 根据定义,64位代码知道其在v8上以AArch64状态运行。 如果32位代码看到" arm64"或任何其他(不准确的)v8同义词,则可以推断出它在AArch32状态下在v8上运行。 如果您没有在运行时进行动态调度,那么您的目标体系结构就是您选择为其编译的对象。
-
我想报告的目标架构。
尽管这不是该问题的100%答案,但可能有用:
使用clang时,您可以使用以下方法区分32位臂和64位臂:
__arm__,仅针对32位臂定义。
__aarch64__,仅针对64位ARM定义。
clang --target=... -mcpu=... -E - -dM 将输出所有预定义的预处理器宏(gcc的工作也与此类似)
我看不到单个宏可以提供答案,但是您可能可以使用__ARM_ARCH和defined(__ARM_ARCH_*)的某种组合。
-
__ARM_ARCH拾取32位和64位ARM机器。 我相信Brams的答案更接近正确的答案。
如果__ARM_ARCH_ISA_A64的目标是arm64,则已预定义,
__ARM_ARCH_7S__对于armv7,
__ARM_ARCH_7A__用于armv7。
使用:clang -arch arm64 -E -dM - < /dev/null可以输出预处理宏。
-
它的问题还是答案? 请详细说明。
-
这不能为问题提供答案。 要批评或要求作者澄清,请在其帖子下方发表评论。
-
如果__ARM_ARCH_ISA_A64的目标是arm64,则已预定义。 __ARM_ARCH_7S__对于armv7,__ARM_ARCH_7A__对于armv7。 使用clang -arch arm64 -E -dM - < devnull可以输出预处理marco,我在此找到它。