2011-03-31 20 views
10

यह मैं कुछ समय के लिए गुस्सा दिलाना किया गया, उदाहरण के लिए, अगर मैं इस कोड लिखने की कोशिश कर रहा हूँ के रूप में शाब्दिक:पासिंग सरणी मैक्रो तर्क

<stdin>:8:31: error: macro "ARRAY" passed 4 arguments, but takes just 2 
:

// find the length of an array 
#define ARRAY_LENGTH(arr) (sizeof(arr)/sizeof(int)) 
// declare an array together with a variable containing the array's length 
#define ARRAY(name, arr) int name[] = arr; size_t name##_length = ARRAY_LENGTH(name); 

int main() { 
    ARRAY(myarr, {1, 2, 3}); 
} 

कोड इस त्रुटि देता है

क्योंकि यह ARRAY(myarr, {1, 2, 3}); को ARRAY गुजरने के रूप में myarr, {1, 2, और 3} देखता है। मैक्रोज़ के लिए सरणी पास करने का कोई तरीका है?

संपादित करें: मुझे आवश्यक कुछ जटिल मैक्रोज़ में, मुझे मैक्रो में दो या दो से अधिक सरणी पारित करने की आवश्यकता हो सकती है, इसलिए वैरिएडिक मैक्रो काम नहीं करता है।

उत्तर

21

हां, {} प्रीप्रोसेसर के लिए ब्रांड्स नहीं हैं। आप केवल डमी मैक्रो

#define P99_PROTECT(...) __VA_ARGS__ 
ARRAY(myarr, P99_PROTECT({1, 2, 3})); 

द्वारा तर्कों की रक्षा कर सकते हैं अपने मामले में काम करना चाहिए। इसके द्वारा आपके पास () का पहला स्तर है जो , को तर्क विभाजक के रूप में व्याख्या करने से बचाता है। मैक्रो कॉल के ये () विस्तार पर गायब हो जाते हैं।

statement unroling पर अधिक परिष्कृत मैक्रोज़ के लिए यहां देखें।

+0

क्या सी 99 varargs के बिना ऐसा करने का कोई तरीका है? – Mehrdad

+0

17 साल, और अभी भी कोई सी 99 अनुपालन प्रीप्रोसेसर नहीं है? आपके पास 'PROTECT0', 'PROTECT1' ... आपके पास मौजूद अल्पमामों की सही मात्रा के लिए मैक्रोज़ हो सकता है। –

+0

मुझे लगता है कि मेरा मतलब कुछ दर्दनाक था, लेकिन ऐसा नहीं लगता है। – Mehrdad

संबंधित मुद्दे