C Define预处理器指令中的字符串文本

C Define预处理器指令中的字符串文本,c,string,c-preprocessor,C,String,C Preprocessor,我想在引号内定义指令。问题是: 我正在使用的嵌入式平台中有一个内置函数,它将文字汇编代码作为字符串。我想把它包装成一个宏 __asm__("goto 0x2400"); 上面的内置函数处理器跳转到位置0x2400处的代码并开始在该地址执行(对于那些想知道的人,我正在编写一个引导加载程序,这就是为什么这是必要的)。因为地址在字符串中,我无法轻松替换它。我需要一种使函数通用的方法,这样我就可以开始在任何地址执行代码。例如: #define ASM_GOTO __asm__("goto X") 这

我想在引号内定义指令。问题是:

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

__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);
结果显示为
\uuuuuasm\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,我想这不是你想要的

所以

可能更像它,因为在
ASM_GOTO
的扩展中,
X
STRINGIZE
作用于它之前得到扩展

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

您需要使用。比如:

#define ASM_GOTO(x) __asm("goto " #x)

应该做你需要它做的事。

这很有效。感谢使用两个定义的想法。我在第一个问题上遇到了困难。如果在另一个定义中定义地址,则此操作不起作用。请参阅所选的错误答案。确实如此。但它确实适用于最初发布的问题。如果你想扩展符号地址,那么你真的应该在问题中说明这一点。如果你在另一个define中定义地址,这是行不通的。请参阅所选的错误答案。
#define STRINGIZE(X) #X
#define ASM_GOTO(X) __asm__("goto " STRINGIZE(X))
#define ASM_GOTO(x) __asm("goto " #x)