我想在引文中使用#define
指令。这是问题所在:
我正在使用的嵌入式平台中有一个内置函数,它将文字汇编代码作为字符串。我想把它包装成一个宏。
__asm__("goto 0x2400");
上面的内置函数处理器跳转到位置0x2400处的代码并开始在该地址执行(对于那些想知道的人,我正在编写一个引导加载程序,这就是为什么这是必要的)。因为地址在字符串中,所以我不能轻易替换它。我需要一种方法使函数通用,以便我可以开始在任何地址执行代码。例如:
#define ASM_GOTO __asm__("goto X")
这不会导致正确的文本替换,因为X在引号中。有办法解决这个问题吗?
答案 0 :(得分:10)
#define ASM_GOTO(X) __asm__("goto " #X)
但这有一个小问题:
#define MAGIC_ADDRESS 0x2400
ASM_GOTO(MAGIC_ADDRESS);
__asm__("goto " "MAGIC_ADDRESS");
中的结果,我期望这不是你想要的。
所以,
#define STRINGIZE(X) #X
#define ASM_GOTO(X) __asm__("goto " STRINGIZE(X))
可能更喜欢它,因为在ASM_GOTO
的扩展中,X
会在STRINGIZE
作用于它之前展开。
如果您还不知道,请注意虽然预处理器的结果是"goto " "0x2400"
(两个字符串文字标记),但它们在编译期间合并为一个字符串文字(5.1.1.2/6) C99)。这是在宏扩展(4)之后但在语义分析(7)之前发生的。
答案 1 :(得分:4)
试试这个:
#define ASM_GOTO(X) __asm__("goto "#X)
答案 2 :(得分:1)