2016-06-12 34 views
0

我正在使用XC8編譯器開發帶PIC的小型嵌入式應用程序。在XC8設置的銷(輸出或輸入)的使用,程序員應當執行這樣的指令:如何在#define中評估逗號

TRISAbits.RA0 = 1; 
特別

  • TRIS在寄存器的前綴(常數)
  • A是端口
  • 比特的後綴(常數)
  • RA0是銷的名稱

我想要做的是與人類可讀的名稱來定義所有的引腳,如:

#define LED_1  A,RA0 
#define LED_2  A,RA1 
#define SWITCH_1 B,RB5 
... 

,並定義了一些宏像這樣使用SET_OUTPUTSET_INPUTSET_OUTPUT(LED_1)

我試圖做的就是這兩個宏:

#define SET_INPUT(port, pin) TRIS ## port ## bits. ## pin ## = 0 

然而,先前定義的常量裏面的逗號沒有擴大,解釋爲一個單獨的參數。我也試過:

#define SET_INPUT(X) SET_INPUT_(X ## "") 
#define SET_INPUT_(port, pin) TRIS ## port ## bits. ## pin ## = 0 

沒有成功。

本質上是這個問題的反面:Comma in C/C++ macro

是否存在一個解決方案或更方便的方式來做到這一點?

+0

在你說的應該是開始'= 1',但你試過'= 0'在您的宏,那是什麼呢? –

回答

2

你接近:

#define SET_INPUT(X) SET_INPUT_(X) 
#define SET_INPUT_(port, pin) TRIS ## port ## bits.pin = 1 

##僅用於粘貼兩個標記形成另一種令牌。對於沒有形成新令牌的情況(例如bits.pin),您不需要做任何特別的事情。

我會建議statement-izing the macro

#define SET_INPUT_(port, pin) do { TRIS ## port ## bits.pin = 1; } while (0)