2015-04-27 25 views
8

Desidero essere in grado di definire una tupla che rappresenta gli argomenti necessari per altre macro.#define una tupla in C

Penso che il modo migliore per mostrare quello che voglio è quello di mostrare un esempio:

#include <avr/io.h> 

#define LED_PORT PORTB 
#define LED_DDR DDRB 
#define LED_PIN PB7 
#define LED  LED_PORT, LED_DDR, LED_PIN 

#define OUTPUT(port, ddr, pin) ddr |= 1 << pin 

void main(void) { 
    OUTPUT(LED); 
} 

voglio OUTPUT(LED) per poi essere ampliato in:

LED_DDR |= 1 << LED_PIN 

Il problema che ho è quello di fare con l'ordine di espansione, e risultati nella seguente errore:

macro "OUTPUT" requires 3 arguments, but only 1 given

Questo è fo Utilizzare con un progetto AVR con hardware personalizzato dove ho definito LED e altri componenti con un rispettivo LED_PORTLED_DDR e LED_PIN.

Quindi voglio definire più macro che possono assumere questo LED e utilizzare gli argomenti appropriati per mappare nel modo più succinto possibile.

Ciò è possibile con il preprocessore C standard?

+0

Mostra la definizione di 'LET_PIN' e' LET_PORT' e 'LET_DDR' e' OUTPUT'. Quindi * modifica la tua domanda * per migliorarla. –

+1

Vorrei taggare questa domanda con [tag: c-preprocessore]. – Michas

+0

Possiamo supporre che 'PORTB',' DDRB', 'PB7' siano costanti intere letterali? –

risposta

6

è possibile aggiungere un livello di indirezione alla macro per raggiungere questo obiettivo:

#define OUTPUT_I(port, ddr, pin) ddr |= 1 << pin 
#define OUTPUT(spec) OUTPUT_I(spec) 

Durante la ripetizione della scansione, spec si espande prima OUTPUT_I, quindi la macro OUTPUT_I vede tre parametri.

+0

Suona bene, proveremo ora. – flungo

+0

Ho l'impressione che questo non verrà compilato. 'OUTPUT_I' si aspetta tre parametri. – alk

+0

@alk E ottiene tre parametri, poiché l'argomento della funzione viene espanso prima della macro della funzione durante la riscansione (come ho menzionato nella risposta). – Wintermute