2011-04-16 48 views
1

我有問題的建設C我的PIC的宏。對於其他基於C的系統也是如此,因此非PIC專家也非常歡迎。在C中的高級預處理器令牌化

讓我們假設我已經定義了我的LED_1針:

#define LED_1 A1 //A1 as output for LED_1 

所以,如果我想點亮LED我會寫:

PORTAbits.RA1 = 1; 

如果我想用做我的LED_1定義我要增加兩個宏:

#define change_PORT_(var) PORTAbits.R##var 
#define change_PORT(var) change_PORT_(var 

,並使用它:

change_PORT(LED_1) = 1; 

它的功能就像一個魅力。但問題是,在上面的定義我有

PORT A bits.##var

那麼,如果我想改變PORTB值?我將不得不爲PORT A和B構建單獨的宏。但它甚至不是一個可靠的解決方案。 我想出了一個想法,我不知道爲什麼,不工作。

#define LED_1 A1 
#define LED_2 B1 

#define __A1 A //This would be defined for all PORTA's pins such as A2,A3,A4 etc 
#define __B1 B 

#define ___change_PORT(var,var2) PORT##var2 bits.R##var 
#define __change_PORT(var,var2) ___change_PORT(var,var2) 
#define _change_PORT(var) __change_PORT(var,__##var) // creating e.g. __A1 
#define change_PORT(var) _change_PORT(var) 

,當我嘗試運行此:

change_PORT(LED_1); 

編譯器改變__ ## VAR___A1,但它永遠不會改變__A1一個所以這個宏沒有按不按預期工作。

我花了很多時間試圖解決它,所以我想感謝所有幫助:)


EDIT::


我可能已經找到了解決我的問題:
(LAT是另一個寄存器名,但它的工作原理相同,PORT,故有此名變化是無關緊要的)

#define ___PORTchange(var,var2) PORT##var2##bits.R##var 
#define __PORTchange(var,var2) ___PORTchange(var,var2) 
#define CHANGE_TO_PORT_NAME(var) ___##var 
#define _PORTchange(var) __PORTchange(var,CHANGE_TO_PORT_NAME(var)) 
#define PORTchange(var) _PORTchange(var) 

但我得到一個編譯器錯誤:

100: PORTAbits.RA0 = 1;
^(374) missing basic type; int assumed (warning)
^(983) storage class redeclared
^(984) type redeclared
^(239) identifier "PORTAbits" redefined (from line 3900)
^(314) ";" expected

所以沒有它正確替代它,但我得到一個編譯器警告告訴我,我重新定義PORTAbits,我不明白。我只是希望預處理器將PORTchange(var)更改爲PORTxbits.Rvar其中x是A或B.但相反,似乎我正在重新聲明某些內容。

我不明白。

+0

你能給一個最小但完整的代碼嗎? (並陳述您期望/想要的以及您得到的結果。) – AProgrammer 2011-04-16 17:17:59

+0

我在編輯標記後更改了代碼。我現在的問題是爲什麼我的宏不僅僅用一個文本替換一個文本,而是試圖重新定義一些預定義的結構(PORTAbits)。 – Krystian 2011-04-16 17:30:37

+0

從您引用的錯誤中,使用環境非常重要。 – AProgrammer 2011-04-16 17:33:36

回答

1

如果我進行預處理(試過幾個版本的GCC和太陽CC)

#define LED_1 A1 
#define LED_2 B1 

#define __A1 AX 
#define __B1 BX 

#define ___change_PORT(var,var2) PORT##var2##bits.R##var 
#define __change_PORT(var,var2) ___change_PORT(var,var2) 
#define _change_PORT(var) __change_PORT(var,__##var) 
#define change_PORT(var) _change_PORT(var) 

change_PORT(LED_1); 
change_PORT(LED_2); 

我得到

PORTAXbits.RA1; 
PORTBXbits.RB1; 

這是你想要什麼明顯。編譯器中的錯誤?

+0

我找到了部分解決方案並編輯了我的帖子。 @AProgrammer你能告訴現在有什麼問題嗎?或者甚至更好的解決方案;) – Krystian 2011-04-16 17:07:16