2012-11-28 75 views
1

我定義如下,當然這是不正確......的#define語法的解決方案

#define SET_PIN_MODE_INPUT(DREG, PORT, PIN) (DREG &= ~_BV(PIN), PORT &= ~_BV(PIN)) 
#define LED_CLOCK_PIN (DDRB, PORTB, PB3) 

,我想使用它們像這樣:

SET_PIN_MODE_INPUT(LED_CLOCK_PIN) 

所以我需要幫助C語法。

回答

6

的間接要求:

#define SET_PIN_MODE_INPUT_(DREG, PORT, PIN) (DREG &= ~_BV(PIN), PORT &= ~_BV(PIN)) 
#define SET_PIN_MODE_INPUT(ARGS) SET_PIN_MODE_INPUT_ ARGS 

// Note that this is an object-like macro 
#define LED_CLOCK_PIN /**/ (DDRB, PORTB, PB3) 

根據您當前的宏,您傳遞的一個參數SET_PIN_MODE_INPUT,這需要三個參數。

該解決方案使用間接方式使用替換列表LED_CLOCK_PIN作爲調用實際SET_PIN_MODE_INPUT的參數列表。

+1

「計算機科學中的所有問題都可以通過另一個間接層面來解決。」 - 大衛惠勒 –

+2

@詹姆斯,或許應該提一下,宏和左邊的'('是這個工作的基本要素,甚至可能適合在兩者之間粘貼註釋以強調這一點。 –

+0

還有一件事...有什麼辦法可以省略其中一個參數嗎?我還有兩個參數:'#define SET_PIN_VALUE_LOW_(PORT,PIN)(PORT | = _BV(PIN))',並且仍然希望通過'LED_CLOCK_PIN'和DDRB參數可以省略 – Pablo

1

您可能希望將它們定義爲頭文件中的靜態內聯函數,而不是定義。通過這種方式,您將得到類型檢查,並且您不會冒險因爲預處理器而發生意想不到的事情。

而編譯器會內聯它們。

+0

這是用於8位慢速微處理器,因此運行速度會更快。 – Pablo

+1

@Pablo,一個內聯函數通常會讓你沒有任何循環。編譯可能會延長一些納秒,但是:) –

+1

在循環和定時器ISR中,所有周期都在計數中......不幸的是,甚至1-2個週期也很重要。 – Pablo