2015-04-27 6 views
8

में एक tuple परिभाषित करें मैं एक tuple परिभाषित करने में सक्षम होना चाहता हूँ जो अन्य मैक्रोज़ द्वारा आवश्यक तर्कों का प्रतिनिधित्व करता है।# सी

मुझे लगता है कि मैं चाहता हूँ एक उदाहरण दिखाने के लिए है दिखाने के लिए सबसे अच्छा तरीका है:

LED_DDR |= 1 << LED_PIN 

समस्या यह है कि मैं पाने के लिए है:

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

मैं चाहता हूँ OUTPUT(LED) तो में विस्तार किया जा करने के लिए विस्तार के क्रम के साथ करें, और निम्नलिखित त्रुटि में परिणाम:

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

यह है कस्टम निर्मित हार्डवेयर के साथ एक एवीआर प्रोजेक्ट के साथ उपयोग करें जहां मैंने LED और संबंधित LED_PORTLED_DDR और LED_PIN के साथ अन्य घटक परिभाषित किए हैं।

मैं फिर अधिक मैक्रोज़ को परिभाषित करना चाहता हूं जो इस एलईडी को ले जा सकते हैं और संभवतः सबसे संक्षिप्त तरीके से मानचित्र के लिए उपयुक्त तर्कों का उपयोग कर सकते हैं।

क्या यह मानक सी-प्रीप्रोसेसर के साथ संभव है?

+0

'LET_PIN' और' LET_PORT' और 'LET_DDR' और' OUTPUT' की परिभाषा दिखाएं। तो * इसे सुधारने के लिए * अपना प्रश्न संपादित करें। –

+1

मैं इस प्रश्न को टैग [सी: प्रीप्रोसेसर] के साथ टैग करूंगा। – Michas

+0

क्या हम मान सकते हैं कि 'पोर्ट बी', 'डीडीआरबी', 'पीबी 7' शाब्दिक पूर्णांक स्थिरांक हैं? –

उत्तर

6

आप इस लक्ष्य को हासिल करने के लिए मैक्रो को अविवेक का एक स्तर जोड़ सकते हैं:

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

दौरान rescanning, specOUTPUT_I से पहले का विस्तार किया गया है, इसलिए OUTPUT_I मैक्रो तीन मापदंडों को देखता है।

+0

अच्छा लगता है, अब यह एक बार जाएगा। – flungo

+0

मेरे पास यह इंप्रेशन है कि यह संकलित नहीं होगा। 'OUTPUT_I' तीन पैरामीटर की अपेक्षा करता है। – alk

+0

@alk और यह तीन पैरामीटर प्राप्त करता है, क्योंकि फंक्शन तर्क को रीस्कैनिंग के दौरान फ़ंक्शन मैक्रो से पहले विस्तारित किया जाता है (जैसा कि मैंने उत्तर में बताया है)। – Wintermute