Define preprocessor指令中的字符串文字

时间:2011-08-09 16:46:57

标签: c string c-preprocessor

我想在引文中使用#define指令。这是问题所在:

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

__asm__("goto 0x2400");

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

#define ASM_GOTO __asm__("goto X")

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

3 个答案:

答案 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)

您需要使用stringize operator。类似的东西:

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

应该做你需要做的事。