C预处理程序令牌替换失败,出现解析错误

时间:2011-02-01 14:46:45

标签: c assembly c-preprocessor inline-assembly

我在 C 程序中定义了以下宏:

#define ISE1  "cust_add"
#define ISE2  "cust_sub"

#define ise_inst(inst, a, b, c) \
asm volatile (
" " inst " %1, %2, %0          \n\t" \
: "=r" (c) \
: "r" (a), "r" (b) \
: "%g0" \
)

在主程序中,我使用以下参数调用宏:

ise_inst(ISE1, inp1, inp2, res);

理想情况下,预处理器应该扩展整个内容,以便得到以下结果:

asm volatile (
" cust_add %1, %2, %0          \n\t"
: "=r" (res)            
: "r" (inp1), "r" (inp2)         
: "%g0"                                                   
); 

任何人都知道我做错了什么?目前,预处理器告诉我

  

错误:在字符串常量之前解析错误(@ line:“”inst“%1,%2,%0 \ n \ t”)

3 个答案:

答案 0 :(得分:3)

\行之后,您似乎错过了asm volatile(行续行字符。

答案 1 :(得分:1)

除了缺少\之外,汇编程序指令必须按照以下方式进行字符串化:

#define ise_inst(inst, a, b, c)       \
asm volatile (                        \
" " #inst " %1, %2, %0          \n\t" \
: "=r" (c)                            \
: "r" (a), "r" (b)                    \
: "%g0"                               \
)

请注意#之前的小inst。如果您使用ISE1调用您的宏,则会展开为"ISE1"

答案 2 :(得分:0)

您是否忘记了\之后的反斜杠字符(asm volatile ()?