2013-08-18 125 views
1

我在MCU頭文件測試結構具有成員名稱

typedef struct tagANSBBITS { 
    unsigned ANSB0:1; 
    unsigned ANSB1:1; 
    unsigned ANSB2:1; 
    unsigned ANSB3:1; 
    unsigned ANSB4:1; 
    unsigned :7; 
    unsigned ANSB12:1; 
    unsigned ANSB13:1; 
    unsigned ANSB14:1; 
    unsigned ANSB15:1; 
} ANSBBITS; 

限定的結構只有某些位定義,因爲它們是在HW實現。 問題是我自己做一個宏這樣

#define pinMode(pin) pin(_ANS_F) 
#define _ANS_F(alpha,bit) (ANS ## alpha ## bits.ANS ## alpha ## bit) 

而且這樣

pinMode(RED_LED) = 0; 

相應ANSBx沒有在結構上定義的時候,這顯然無法使用。在使用宏之前,我可以以某種方式測試ANSx的存在嗎?或說服gcc這沒關係?

由於提前,

+0

你想達到什麼目的?對不起,我現在迷了路。你爲什麼要做這些宏?你能解釋一下嗎? – lpapp

+2

宏在編譯器知道你的結構存在之前就發生了。此外,你的第二個宏是[保留標識符](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c- identifier)。 – chris

+0

編譯器供應商提供的表頭是否以這種形式提供?嘗試將C位字段映射到硬件寄存器通常不是一個好主意,因爲您無法控制生成的代碼的順序或讀取 - 修改 - 寫入行爲。 – sh1

回答

3

不能在一個struct測試特定位的存在或不存在:如果編譯器看到日提交的未定義爲一個參考,如果沒有碼它甚至會抱怨達到該領域的路徑。但是,你可以添加一些自己的「元數據」,使單個宏可用在所有情況:

// This is your "metadata": it defines which fields your struct has 
static extern unsigned int unused; // Access of undefined values redirects here 
#define ANSB0 ANSBBITS.ANSB0  // ANSB0 and ANSB2 are defined 
#define ANSB1 unused    // ANSB1 is not defined 
#define ANSB2 ANSBBITS.ANSB2 
...        // Do the remaining bits in the same way 

現在你可以重寫你的「神奇」的宏是這樣的:

#define _ANS_F(alpha,bit) (ANS ## alpha ## bit) 

對於本要進行編譯,您需要爲元數據頂部聲明的靜態unused變量添加一個定義。

+0

感謝您的回答,所以我必須對自己的.h稍作修改。那麼我不想像你所建議的那樣編譯。一些引腳存在於硬件中,但沒有ANS功能(僅限數字引腳)。當我選擇這個引腳時,我只是不想編譯ANS初始化,因爲它沒有這個功能。所以#define現有的似乎是唯一的選擇... – user1973900