2011-02-01 84 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