gpt4 book ai didi

c - 定义预处理器指令中的字符串文字

转载 作者:太空狗 更新时间:2023-10-29 15:46:13 26 4
gpt4 key购买 nike

我想在引号内使用 #define 指令。问题是:

我正在使用的嵌入式平台中有一个内置函数,它将文字汇编代码作为字符串。我想把它包装成一个宏。

__asm__("goto 0x2400");

上面的内置函数处理器跳转到 0x2400 位置的代码并开始在该地址执行(对于那些想知道的人,我正在编写一个引导加载程序,这就是为什么这是必要的)。因为地址在字符串中,所以我无法轻易替换它。我需要一种使函数通用的方法,以便我可以在任何地址开始执行代码。例如:

#define ASM_GOTO __asm__("goto X")

这不会导致正确的文本替换,因为 X 在引号中。有解决办法吗?

最佳答案

#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 的扩展中,XSTRINGIZE 作用于它之前被扩展。

如果您还不知道,请注意虽然预处理器的结果是 "goto ""0x2400"(两个字符串文字标记),但它们在编译过程中会合并为一个字符串文字(C99 的 5.1.1.2/6)。这发生在宏展开 (4) 之后,但在语义分析 (7) 之前。

关于c - 定义预处理器指令中的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6999762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com