2015-04-27 18 views
8

Ich möchte in der Lage sein, ein Tupel zu definieren, das die Argumente anderer Makros darstellt.#define ein Tupel in C

ich die beste Art und Weise denken, was ich zeigen will, ist ein Beispiel zeigen:

LED_DDR |= 1 << LED_PIN 

Das Problem, das ich bekommen ist:

#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); 
} 

Ich möchte OUTPUT(LED) dann in erweitert werden tun mit der Reihenfolge der Erweiterung und führt zu den folgenden Fehler:

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

Dies ist fo r Verwendung mit einem AVR-Projekt mit kundenspezifischer Hardware, wo ich LED und andere Komponenten mit jeweils LED_PORTLED_DDR und definiert habe.

Ich möchte dann mehr Makros definieren, die diese LED nehmen und die passenden Argumente verwenden können, um die kürzeste Möglichkeit zu erreichen.

Ist dies mit dem Standard-C-Präprozessor möglich?

+0

Zeigen Sie die Definition von 'LET_PIN' und' LET_PORT' sowie 'LET_DDR' und' OUTPUT' an. Also * redigiere deine Frage * um sie zu verbessern. –

+1

Ich würde diese Frage mit [Tag: c-Präprozessor] kennzeichnen. – Michas

+0

Können wir annehmen, dass 'PORTB',' DDRB', 'PB7' literale ganzzahlige Konstanten sind? –

Antwort

6

Sie können eine Dereferenzierungsebene zum Makro hinzufügen, um dies zu erreichen:

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

Während Wiederablichtende, spec vor OUTPUT_I erweitert wird, so dass die OUTPUT_I Makro sieht drei Parameter.

+0

Hört sich gut an, wir werden es jetzt versuchen. – flungo

+0

Ich habe den Eindruck das wird nicht kompiliert. 'OUTPUT_I' erwartet drei Parameter. – alk

+0

@alk Und es erhält drei Parameter, weil das Funktionsargument vor dem Funktionsmakro beim Rescanning erweitert wird (wie ich in der Antwort erwähnt habe). – Wintermute