2013-02-14 102 views
2

如果有什麼方法可以在編譯時向Arduino預處理器發出Halt/Abort信號?arduino中的預處理器聲明

我對一般的高級預處理指令不是很熟悉,但是我發現在某些編譯器中有編譯時斷言的'庫'。

背景:

爲了防止重複引腳分配在代碼中我創建了一個枚舉,以確定每個引腳

enum DataPins 
{ 
    /* 00 */ UNUSED_00, 
    /* 01 */ UNUSED_01, 
    /* 02 */ PIN_IN_SNR0_ECHO, 
    /* 03 */ PIN_IN_SNR1_ECHO, 
... 
    /* 53 */ UNUSED_53, 
    /* check */ z_DONOTUSE54 
}; 

然後我想檢查的最終名稱以確保它在編譯時有正確的值:

#define PinsOK z_DONOTUSE54==54 

有沒有辦法在編譯時評估這個?如果是這樣,那麼基於這個結果,我可以在Arduino中發出編譯時錯誤嗎?

回答

1

預處理器可能會產生錯誤,但請記住它在編譯時間之前運行。它只是按照預處理器指令的指示處理源文件進行替換和翻譯。嚴格地說,它不關心你的文件甚至是C++源代碼。

所以不,預處理不能知道枚舉{}定義的內容。

但是,如果你仍然需要問題的錯誤方面:

#define X 

#ifdef X 
#error ERROR my message 
#endif 

如果你正在尋找一個替代節省一些打字和持續構建枚舉的名稱,你可以使用預處理構造枚舉線。如果明確指定這些值,則可能不在意引腳中的間隙。

#define P(no_,name_) Pin##name_ = no_ 
#define U(no_) PinUnused##no_ = no_ 

enum { 
    P(0,Abc), 
    U(1), 
    P(2,Something), 
    P(15,OutWhatever) 
}; 


int p; 
p = PinAbc; 
p = PinUnused1; 
p = PinSomething; 
+0

謝謝。作爲一個新問題,這可能會更好,但是現在我確定答案是否定的:在編譯時是否有任何可以通過concievable驗證枚舉的方法? – Derrick 2013-02-15 15:17:46

+0

您正試圖檢查所有54個引腳是否已定義。如果您明確定義枚舉值,您是否在意是否存在差距? – jdr5ca 2013-02-16 06:28:23

+0

我不在乎差距,我只是試圖找到一種強制執行的方式,即不能給出同一個引腳號碼兩個不同的名稱。您添加的信息很有幫助,更清潔:謝謝! – Derrick 2013-02-19 15:05:56

1

我建議看.. .. \ SdFat \ utility \ DigitalPin.h在http://code.google.com/p/sdfatlib/downloads/list找到。它演示了引腳檢查和預編譯斷言「屬性((錯誤(」引腳號太大或不是常數「)));」這與digitalWriteFast.h類似,但需要更多一點。在這兩個例子中,他們正在測試引腳是靜態還是可變的。與你的目標略有不同。