सी

2017-01-29 6 views
8

में अस्थायी (यौगिक शाब्दिक) पैरामीटर का पता लेना मुझे कल्पना नहीं है कि यह पहले से ही डुप्लिकेट नहीं है, लेकिन मुझे आसानी से उत्तर नहीं मिल सकता है क्योंकि विशेष रूप से सी ++ के लिए अधिक जटिल परिदृश्य चर्चा पर हावी होने लगते हैं ।सी

यह C99 में एक समारोह कॉल के पैरामीटर सूची में निर्माण के लिए एक अस्थायी का पता ले लेने के लिए कानूनी है?

उदाहरण के लिए, init_list या init_desig_init के रूप में की तरह कुछ इस प्रकार है:

typedef struct { 
    int x; 
    int y; 
} point_t; 

int manhattan(point_t *p) { 
    return p->x + p->y; 
} 

int init_list() { 
    return manhattan(&(point_t){1, 2}); 
} 

int init_desig_init() { 
    return manhattan(&(point_t){.x = 1}); 
} 

तीन बड़ी seem to compile it OK, लेकिन मैं वास्तव में यह बताता है कि अस्थायी के जीवनकाल में बढ़ाया जाएगा एक संदर्भ नहीं मिल सकता है कम से कम फ़ंक्शन कॉल के माध्यम से।


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

मैं इसे बुलाना चाहिए "बड़ी पार मंच तीन" वास्तव में, MSVC के सम्मान है, लेकिन वास्तव में मैं वास्तव में सिर्फ "सी compilers godbolt का समर्थन करता है" मतलब है।

+1

जवाब मिला अच्छा है, लेकिन वहाँ एक छोटे से पकड़ लिया है कि ध्यान में रखना फ़ायदेमंद है - बहुत अच्छा बिंदु http://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks – Art

+0

@Art: जब आप अधिक बड़े पैमाने पर यौगिक शाब्दिक का उपयोग शुरू। जैसा कि अगर सी ++ में सी बनाम अस्थायी में यौगिक अक्षर के लिए विभिन्न जीवनकाल नियमों को याद रखने की कोशिश कर रहा था ... – BeeOnRope

उत्तर

7

(point_t){1, 2} एक "अस्थायी" नहीं है। यह एक यौगिक शाब्दिक है। (सी ++ में टोकन के समान अनुक्रम का एक अलग अर्थ है, इन दो भाषाओं को एक दूसरे के साथ भ्रमित नहीं किया जाना चाहिए)।

एक यौगिक शाब्दिक एक lvalue है, इसलिए यह यह पर एकल & ऑपरेटर का उपयोग करने के लिए कानूनी है। भंडारण अवधि C11 6.5.2.5/5 द्वारा कवर किया जाता: यौगिक शाब्दिक एक समारोह के शरीर के बाहर होता है

हैं, तो वस्तु स्थिर भंडारण अवधि है; अन्यथा, इसमें संलग्न ब्लॉक से जुड़ा स्वचालित भंडारण अवधि है।

तो यह कोड सही है, और मिश्रित शाब्दिक समारोह में घोषित किया गया था के अंत तक मौजूदा रहता है।

+0

धन्यवाद। "अस्थायी" का मेरा उपयोग भी आंशिक रूप से बताता है कि इस पर विवरण के लिए मुझे इतना कठिन समय क्यों मिला। अतिरिक्त संदर्भ के लिए, यहां [gcc doc पर _compound literals_] (https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html) है। – BeeOnRope