我有問題的建設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.但相反,似乎我正在重新聲明某些內容。
我不明白。
你能給一個最小但完整的代碼嗎? (並陳述您期望/想要的以及您得到的結果。) – AProgrammer 2011-04-16 17:17:59
我在編輯標記後更改了代碼。我現在的問題是爲什麼我的宏不僅僅用一個文本替換一個文本,而是試圖重新定義一些預定義的結構(PORTAbits)。 – Krystian 2011-04-16 17:30:37
從您引用的錯誤中,使用環境非常重要。 – AProgrammer 2011-04-16 17:33:36