私は次のように定義しましたが、もちろん正しくありません...
#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構文のヘルプが必要です。
私は次のように定義しましたが、もちろん正しくありません...
#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構文のヘルプが必要です。
インダイレクションが必要です:
#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
、これには 3 つの引数が必要です。
このソリューションでは、間接参照を使用して、の置換リストをLED_CLOCK_PIN
real の呼び出しの引数リストとして使用しますSET_PIN_MODE_INPUT
。
定義するのではなく、ヘッダー ファイルで静的インライン関数として定義することをお勧めします。このようにして、型チェックを取得し、プリプロセッサが原因で予期しないことが起こる危険を冒しません。
そして、コンパイラはそれらをインライン化します。