2012-12-07 12 views
6

संभव डुप्लिकेट:
Do-While and if-else statements in C/C++ macrosसमारोह मैक्रो घुंघराले ब्रेसिज़ की तरह या do..while

gcc (GCC) 4.7.2 
c89 

हैलो,

मैं निम्नलिखित समारोह की तरह मैक्रो और बस यह सोचकर कि कई लाइनों में उपयोग करते समय पसंदीदा उपयोग क्या है। घुंघराले ब्रेसिज़ का उपयोग करना या ... (0) लूप करना बेहतर है।

आम तौर पर मैं सब कुछ के लिए एक ..... (0) का उपयोग करता हूं। लेकिन मैंने कुछ परियोजनाएं देखी हैं जहां वे घुंघराले ब्रेसिज़ का उपयोग करते हैं, और मुझे यकीन नहीं है कि कौन सा बेहतर होगा।

do..while

#define DSO_ERROR(msg, res_handle_module, mem_pool, size) do {  \ 
     char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size);  \ 
     apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \ 
     LOG_ERR("%s dso error %s", (char*)msg, dso_error);    \ 
     goto dso_failure;            \ 
    } while(0); 

घुंघराले ब्रेसिज़

#define DSO_ERROR(msg, res_handle_module, mem_pool, size) {    \ 
     char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size);  \ 
     apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \ 
     LOG_ERR("%s dso error %s", (char*)msg, dso_error);    \ 
     goto dso_failure;            \ 
    } 

फर्क सिर्फ इतना है कि एक सेमी-कोलन do..while पाश पर और घुंघराले ब्रेसिज़ पर नहीं पूर्व निर्धारित किया जाएगा।

किसी भी सुझाव के लिए बहुत धन्यवाद,

+1

मेरी भलाई, यह बदसूरत कोड है। (कोई अपराध इरादा नहीं है, मैं बस बहुत हैरान हूँ)। – rubenvb

+3

'do {...} के अंत तक अर्धविराम जोड़ना (0)' (0) 'का उपयोग करने के उद्देश्य को हराता है {...} जबकि (0)' पहली जगह में। ब्रेसिज़-केवल संस्करण का नुकसान यह है कि आप 'अगर (कुछ) DSO_ERROR (...) लिख नहीं सकते हैं; अन्य {...} 'क्योंकि अर्धविराम' if' के बाद एक शून्य कथन है और 'else' एक वाक्यविन्यास त्रुटि है। 'Do {...} जबकि (0)' के सही संस्करण के साथ, 'if'/'else' नोटेशन काम करता है जैसा कि आप उम्मीद करेंगे कि मैक्रो वास्तव में एक फ़ंक्शन था। –

उत्तर

7

घुंघराले ब्रेस संस्करण इस तरह उपयोग टूट जाएगा:

if(foo) 
    DSO_ERROR("Foo occured!", my_module, the_pool, 4711); 
else 
    printf("All is well, there is no foo\n"); 

जो do ... while(0) निर्माण के लिए बहुत कारण है। तो यह टालने लायक लगता है।

if (one) 
    DSO_ERROR("one", ...); 
else 
    DSO_ERROR("two", ...); 

इसलिए यदि आप अर्धविराम के बिना क्या-while-मैक्रो का उपयोग करें, आप ठीक हो जाएगा:

+2

ओपी द्वारा लिखे गए अनुसार, ... जबकि (0) संस्करण भी टूट जाएगा क्योंकि इसके अंत में एक अतिरिक्त अर्धविराम है। काम लिखने का सही तरीका ... जबकि (0) अर्धविराम के बिना है। –

2

आमतौर पर आप नहीं करना मैक्रो में do { ... } while (0) पर अर्धविराम है।

मैक्रो के लिए do { ... } while (0) आपके कारण है, तो आप स्रोत में मैक्रो का उपयोग कर सकते हैं और अतिरिक्त खाली कथन के बिना अर्धविराम जोड़ सकते हैं। यह ज्यादातर ऐतिहासिक कारणों से है, मुझे लगता है कि खाली वक्तव्य (यानी बिना किसी बयान के अर्धविराम) कई मामलों में कुछ भी नहीं करता है।

+5

"कुछ भी नहीं करता है" को छोड़कर अन्य समस्याएं –

4

आप इस कोड के साथ एक समस्या होगी।

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