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