2010-01-16 8 views
8

मैंने देखा है कि कभी कभी, सी मैक्रो कुछ इस तरह के रूप में लिखा जाता है:`({}) पर अधिक जानकारी; सी में?

#define foo(bar) ({ ++bar; }) 

कुछ प्रयोग के बाद, मैं पाया है कि:

  1. ({}); संकलन होगा, लेकिन कुछ भी नहीं। (जैसा कि अपेक्षित है।)
  2. ; छोड़ने से सिंटैक्स त्रुटि हो जाएगी। इसका एक दुष्प्रभाव यह सुनिश्चित कर रहा है कि foo() आपके कोड में एक फ़ंक्शन जैसा दिखता है। (हालांकि, यदि आप अर्धविराम बंद करते हैं, तो समस्या का निदान करने के लिए त्रुटि बहुत उपयोगी नहीं है!)
  3. return ({}); एक शून्य मान के बारे में शिकायत नहीं करता है, जैसे कि मैंने शून्य कार्य को उपयोग करने का प्रयास किया था।

क्या यह डेवलपर्स को अपने मैक्रोज़ में अर्धविराम जोड़ने के लिए है, या क्या इसका कोई और उद्देश्य है? मैंने Google की कोशिश की है, लेकिन यह विराम चिह्न के साथ बुरी तरह विफल रहता है। क्या इसके लिए कोई नाम है?

उत्तर

8

यह एक जीएनयू एक्सटेंशन है जिसे statement expressions कहा जाता है।

मानक-सी में मैक्रोज़ घोषित करते समय, आप अक्सर do...while(0) लूप को समान उद्देश्यों (यानी ब्लॉक स्कोप बनाने) के लिए उपयोग करते हैं। एक कथन अभिव्यक्ति लूप हैक से बेहतर है क्योंकि यह एक मान वापस कर सकती है। यदि आप मानक-सी में कुछ ऐसा करना चाहते हैं, तो आपको एक अतिरिक्त फ़ंक्शन को परिभाषित करना होगा और लेक्सिकल स्कॉइंग की सुविधा खोना होगा।

2

() एक अभिव्यक्ति है। ({कोड; कोड;}) एक अभिव्यक्ति के अंदर एक यौगिक बयान है। वह एक जीएनयू सी विस्तार है।

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

संपादित करें: वाह, मैं गूगल से उस लिंक मिला है और ध्यान नहीं था कि यह पहली बार में जीसीसी 2.95 के लिए किया गया था। प्राचीन!

+0

प्राचीन - लेकिन वाक्यविन्यास अभी भी 4.4.2 में समर्थित है। –

3

कथन अभिव्यक्तियों (यदि कोई अच्छी बात है) के बारे में अच्छी बात यह है कि अंतिम विवरण अभिव्यक्ति का परिणाम है।

#define foo(bar) ({ ++bar; 3.1415927; }) 

int i = 0; 
float pi = foo(i); 
संबंधित मुद्दे