2011-02-01 72 views
0

我在Ç程序中定义的以下宏: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"             
); 

任何一个想法,我做错了什么?目前预处理器告诉我

error: parse error before string constant (@ line: " " inst " %1, %2, %0 \n\t")

+3

您可能会考虑修改问题以类似“C预处理程序标记替换失败,并分析错误”。这个问题:“预处理器更换”听起来像是你要替换的预处理器 - 我敢肯定,我已经看到在过去几周内这样的问题。 – 2011-02-01 14:55:15

回答

3

你好像缺少asm volatile(线后\续行符。

0

你没有忘记asm volatile (后反斜杠字符(\)?

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"

+0

谢谢你们,这对你们所有的评论都非常有帮助。它现在有效! – Patrick 2011-02-02 12:08:37