2015-07-28 16 views
29

मैं इस here देखा और मैं नहीं जानता कि इसका क्या मतलब:सी ++ में {int) {1} का क्या अर्थ है?

&(int) { 1 } 

मैंने सोचा कि यह अजीब था, क्योंकि यह अवैध वाक्य रचना की तरह लगता है। यह एक ब्लॉक स्कोप (?) को बीच में एक यादृच्छिक 1 (अर्ध-कोलन के बिना) कास्टिंग और पता ले रहा है। मुझे बहुत समझ में नहीं आता है। क्या आप लोग मुझे प्रबुद्ध कर सकते हैं?

इसे बाहर डब्ल्यू/सी ++ 11 की कोशिश की, तो यह संकलित:

auto a = &(int) { 1 }; 

लेकिन मुझे नहीं पता कि क्या चर के साथ क्या करना है।

+0

कोई संदर्भ जहां से यह है? यह [compile] (http://ideone.com/hyQcy9) स्वयं ही नहीं है ... – yizzlez

+0

एक [कंपाउंड शाब्दिक] (http://stackoverflow.com/q/28116467/1708801) जैसा दिखता है लेकिन बिना सुनिश्चित किए अधिक संदर्भ, अधिक संभावना है कि यह सी कोड था क्योंकि इसे सी ++ में विस्तार के रूप में समर्थित किया गया है और इसका पता लेना संभवतः एक बुरा विचार होगा क्योंकि अर्थात् अलग-अलग हैं। –

+0

@awesomeyi मुझे याद नहीं है। और Google पर कोड के लिए यह सामान्य है कि किसी भी तरह संकलित न करें –

उत्तर

32

जहां तक ​​मेरा बता सकते हैं कि यह एक compound literal है, यह, C99 सुविधा है यह not standard C++ है, लेकिन एक विस्तार के रूप में दोनों जीसीसी और बजना समर्थन यह:

आईएसओ C99 यौगिक शाब्दिक समर्थन करता है। एक यौगिक शाब्दिक दिखने वाला एक कलाकार की तरह दिखता है। इसका मान कास्ट में निर्दिष्ट प्रकार का एक ऑब्जेक्ट है, जिसमें प्रारंभकर्ता में निर्दिष्ट तत्व शामिल हैं; यह एक लालसा है। एक विस्तार के रूप में, जीसीसी सी 9 0 मोड में और सी ++ में यौगिक अक्षर का समर्थन करता है, हालांकि अर्थशास्त्र सी ++ में कुछ अलग है।

आमतौर पर, निर्दिष्ट प्रकार एक संरचना है। दिखाया गया है मान लेते हैं कि struct foo और संरचना घोषित किया जाता है:

structure = ((struct foo) {x + y, 'a', 0}); 

यह निम्न लिखित रूप के बराबर है:

struct foo {int a; char b[2];} structure; 

यहाँ एक यौगिक शाब्दिक के साथ एक struct foo के निर्माण का एक उदाहरण है

{ 
    struct foo temp = {x + y, 'a', 0}; 
    struct 

इस मामले में a के प्रकार होगा int करने के लिए सूचक। उम्मीद है कि यह मूल रूप से सी कोड था क्योंकि जीसीसी दस्तावेज़ कहता है:

सी में, एक यौगिक शाब्दिक स्थिर या स्वचालित संग्रहण अवधि के साथ एक अज्ञात वस्तु को निर्दिष्ट करता है। सी ++ में, एक यौगिक शाब्दिक एक अस्थायी वस्तु निर्दिष्ट करता है, जो केवल पूर्ण अभिव्यक्ति के अंत तक रहता है।

और इसलिए सी ++ में पता लेना शायद एक बुरा विचार है क्योंकि ऑब्जेक्ट का जीवनकाल पूर्ण अभिव्यक्ति के अंत में खत्म हो गया है। हालांकि, यह सी ++ कोड हो सकता था जो कि अपरिभाषित व्यवहार पर निर्भर था।

यह दोनों जीसीसी और बजना -pedantic का उपयोग कर एक चेतावनी और कोई त्रुटि उत्पन्न करेगा में, उन मामलों में जहाँ सही झंडे वास्तव में एक बहुत मदद करता है का उपयोग कर में से एक है उदाहरण जीसीसी के लिए कहते हैं:

warning: ISO C++ forbids compound-literals [-Wpedantic] 
auto a = &(int) { 1 }; 
        ^
error: taking address of temporary [-fpermissive] 

अगर हम का उपयोग -fpermissive जीसीसी है यह वास्तव में इस कोड को संकलित करने की अनुमति देता है। मैं आधुनिक संस्करणों में किसी भी झंडे के साथ इस कोड को बनाने के लिए झुकाव नहीं प्राप्त कर सकता हूं, हालांकि पुराने संस्करण -Wno-address-of-temporary का उपयोग करने की अनुमति देते हैं। मुझे आश्चर्य है कि क्या जीसीसी इसे remnant of an old extension के रूप में अनुमति देता है।

नोट, प्रश्न Cryptic struct definition in C में दिलचस्प की आपकी परिभाषा के आधार पर एक बहुत ही रोचक () यौगिक अक्षर का उपयोग है।

if (setsockopt(server_connection.socket, SOL_SOCKET, SO_REUSEADDR, &(int) { 1 }, sizeof(int)) < 0) { 

दोनों C99 और सी ++ में एक वैध इस्तेमाल होता है:

मतभेद is correct और this question मान लिया जाये कि मूल स्रोत तो उदाहरण में है कि कोड में इस्तेमाल होता है।

5

यह तुरंत स्पष्ट नहीं है, लेकिन यदि आप आसपास के कोड को देखते हैं, तो यह स्पष्ट हो जाता है कि इसका क्या उपयोग किया जाता है, और यह क्या होना चाहिए।

यह एक अस्थायी अज्ञात संरचना का पता ले रहा है जिसमें एक अज्ञात पूर्णांक होता है जिसे सी 99 नामित प्रारंभकर्ता के माध्यम से प्रारंभ किया जाता है। कारण यह है कि setsockopt एक पूर्णांक नहीं चाहता है, लेकिन इसके लिए एक सूचक (या इसके बजाय, कुछ, और कुछ आकार का सूचक)।

दूसरे शब्दों में, यह बहुत अच्छा हैक एक संकेतक की अपेक्षा करने वाले फ़ंक्शन में एक प्रकार का पूर्णांक तर्क (एक स्पष्ट अस्थायी चर के बिना) प्रदान करने के लिए हैक।

इसलिए, यह करने के लिए कार्यात्मक रूप से समान है:

int blah = 1; 
setsockopt(..., &blah, ...); 

... सिवाय यह blah शुरू करने के बिना काम करता है।

+0

मैं यह मानने से थोड़ा सावधान हूं कि संदर्भ वही है जिसे ओपी ने संदर्भित किया है ... Schism ने एक टिप्पणी में निहित किया है, जहां से यह आया था, लेकिन ओपी ने अभी तक पुष्टि नहीं की है। लिंक किसी अन्य उपयोगकर्ता द्वारा ओपी नहीं जोड़ा गया था। –

+0

@ShafikYaghmour: आह, मैंने नहीं देखा कि टिप्पणी ओपी से नहीं थी, सोचा था कि यह था। – Damon

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