在C中我可以使用
#if defined(MULTI_CORE) || defined(CORE_INDEX)
如何在ARM组装文件中获得相同的结果(使用.IFDEF或.IF或任何其他支持的表达式)?我正在使用GCC编译器工具链。
使用.S
文件中的C Preprocessor语法与.c
/.h
中的您一样。使用gcc -c foo.S
(直接as
)构建代码,这会导致gcc
(编译器前端)通过CPP运行文件,然后再将其馈送到as
。
因此,cpp的东西完全发生在任何.if
燃气宏的东西之前和分开发生。
.ifdef
和其他气体宏功能并非旨在替换CPP。您假定使用CPP(或m4
或其他)作为ASM源的预处理器。
请注意,直接在.S
上使用as
通常会在X86上构建而不会出现错误消息,因为#
是该目标的气体语法中的注释字符。例如将#if 0
/#endif
放在一些说明中:它们将在as -o foo.o foo.S
之后的foo.o
中。所有#if
行被视为注释。
在手臂上,您应该吵闹,因为注释字符是@
(立即使用#
)。如果您确实想在任何平台上不小心构建而不意外地构建,则可以#define THIS_FILE_NEEDS_CPP
,然后在下一行上写THIS_FILE_NEEDS_CPP THIS_FILE_NEEDS_CPP
。(两次,这不是有效的标签声明)。通过CPP宏处理,这将变成空白,而不是无效的INSN。as
单独删除//
和/* */
评论,因此您不能仅使用它。但是大多数人没有做任何特别的事情。他们的构建脚本可以正常工作,并且不会随机构建.S
文件,而没有CPP。
另请参见:
- 在天然气组装语言中使用IFDEF。(
.ifdef
符号测试,而不是.macro
宏) - GNU ARM汇编器命令行宏观宏观失败。(CPP将
.ifdef MACRO_FROM_CMDLINE
变成.ifdef 1
)。