2009-10-19 7 views
15

क्या निम्न फ़ंक्शन द्वारा प्रेषित पॉइंटर मान्य है?स्ट्रिंग अक्षर के लिए पॉइंटर्स फ़ंक्शन रिटर्न के बाद वैध रहते हैं?

const char * bool2str(bool flg) 
{ 
    return flg ? "Yes" : "No"; 
} 

यह दृश्य सी ++ और जी ++ में अच्छी तरह से काम करता है। सी ++ मानक इस बारे में क्या कहता है?

+2

हाँ:

आप धाराओं के माध्यम से प्रिंट करने के लिए इस चाहते हैं वहाँ पहले से ही है कि करने के लिए एक मानक सम्मेलन है। लेकिन सी ++ में आपको अभी भी std :: स्ट्रिंग पसंद करना चाहिए। निचे देखो। –

उत्तर

25

भंडारण अवधि पर:

2.13.4 साधारण स्ट्रिंग शाब्दिक और UTF-8 स्ट्रिंग शाब्दिक रूप में भी संकीर्ण स्ट्रिंग शाब्दिक में भेजा जाता है। एक संकीर्ण स्ट्रिंग शाब्दिक, जहां n नीचे के रूप में परिभाषित किया गया स्ट्रिंग के आकार है "n स्थिरांक चार की सरणी" टाइप है, और स्थिर भंडारण अवधि

3.7.1

के साथ पढ़ा है

3.7.1।

सभी ऑब्जेक्ट्स जिनमें डायनामिक स्टोरेज अवधि नहीं है, उनके पास थ्रेड स्टोरेज अवधि नहीं है, और स्थानीय नहीं हैं, स्थानीय में स्थिर भंडारण अवधि है। इन वस्तुओं के लिए भंडारण प्रोग्राम (3.6.2, 3.6.3) की अवधि के लिए जारी रहेगा।

प्रकार पर:

अनुलग्नक सी

उपखंड 2.13.4:

बदलें: स्ट्रिंग शाब्दिक बनाया स्थिरांक एक स्ट्रिंग के प्रकार के शाब्दिक है "चार की सरणी" से "कॉन्स char की सरणी" में बदल दिया गया है। 01 का प्रकारchar16_t स्ट्रिंग शाब्दिक "कुछ-पूर्णांक-प्रकार की सरणी" से "कॉन्स्ट char16_t की सरणी" में बदल दिया गया है। char32_t स्ट्रिंग अक्षर का प्रकार "कुछ-पूर्णांक-प्रकार" की सरणी से "const char char_ की सरणी" में बदल दिया गया है - टी।wchar_t की सरणी स्थिरांक wchar_t की सरणी "को" "एक विस्तृत स्ट्रिंग शाब्दिक के प्रकार से बदल गया है" "

दलील:। यह एक अनुचित अतिभारित समारोह है, जो संशोधित करने में सक्षम हो उम्मीद कर सकते हैं बुला से बचा जाता है इसके तर्क।

मूल सुविधा पर प्रभाव: अच्छी तरह से परिभाषित सुविधा के अर्थशास्त्र में बदलें। कनवर्ट करने में कठिनाई: सरल वाक्य रचनात्मक परिवर्तन, क्योंकि स्ट्रिंग अक्षर को char * में परिवर्तित किया जा सकता है; (4.2)। सबसे आम मामलों को एक नए लेकिन वंचित मानक रूपांतरण द्वारा नियंत्रित किया जाता है: char * p = "abc"; // सी में मान्य, सी ++ char * q = expr में बहिष्कृत? "एबीसी": "डी"; //, सी में मान्य C++

अमान्य व्यापक रूप से इस्तेमाल कैसे: कार्यक्रम संभावित परिवर्तनीय स्मृति की ओर इशारा के रूप में स्ट्रिंग शाब्दिक के इलाज के लिए एक वैध कारण है कि शायद दुर्लभ हैं।

गतिशील रूप से आवंटित (शब्द 'ढेर' मानक में AFAIK स्मृति के एक क्षेत्र के संदर्भ में इस्तेमाल कभी नहीं किया है) स्मृति एक समारोह कॉल कि main जितना रूप में जल्दी के बाद स्थिर स्मृति आवंटित किया जाता है हो सकता है की आवश्यकता है।

+0

+1, लेकिन मानक से आपका उद्धरण सटीक नहीं है (कम से कम 2.13.4)। –

+0

सी-स्ट्रिंग्स के मानक उपयोग के बारे में एक उद्धरण भी उपयोगी हो सकता है। सी दुनिया में एक char * सूचक को वापस करने के लिए और अधिक मानक है जिसे गतिशील रूप से आवंटित किया गया था और इस प्रकार इसे जारी करने की आवश्यकता है। यदि आप इस सम्मेलन का पालन नहीं करते हैं तो आपका कोड मौजूदा पुस्तकालयों के साथ अच्छी तरह से काम नहीं करेगा जो इस सम्मेलन को मानते हैं। –

+1

@ किरील वी। लिडविंस्की: यह सी ++ 0 एक्स ड्राफ्ट एन -4411 (मेरे द्वारा एक टिप्पणी में उल्लिखित) से है। – dirkgently

13

यह कोड पूरी तरह से मान्य और अनुरूप है। केवल "गॉचा" यह सुनिश्चित करना होगा कि कॉलर स्ट्रिंग को मुक्त करने का प्रयास न करे।

+0

"यह कोड पूरी तरह से मान्य और अनुरूप है।" क्यूं कर? –

+0

कोई आवश्यकता नहीं है। शाब्दिक 'कॉन्स्ट चार []' हैं जिन्हें कभी भी आवंटित ढेर नहीं किया जाता है। लौटाया गया सूचक पूरे कार्यक्रम निष्पादन के दौरान मान्य होगा। –

+1

कोई "'const char []' ' –

11

यह कोड मान्य और मानक अनुपालन है।

स्ट्रिंग अक्षर केवल पढ़ने योग्य स्मृति में संग्रहीत हैं, और फ़ंक्शन को चयनित स्ट्रिंग का पता ही मिलता है।

सी ++ मानक (2.13.4) का कहना है:

एक साधारण स्ट्रिंग शाब्दिक टाइप "n स्थिरांक चार की सरणी" और स्थिर भंडारण अवधि

वे कुंजी आपकी समस्या को समझने के लिए है यहां, स्थिर भंडारण अवधि है: आपके प्रोग्राम लॉन्च होने पर प्रोग्रामिंग की अवधि के लिए स्ट्रिंग अक्षर आवंटित किए जाते हैं। आपका फ़ंक्शन बस पता चला है और इसे वापस कर देता है।

5

तकनीकी तौर पर हाँ, यह वैध है।
तारों में स्थिर भंडारण durataion है।

लेकिन वह पूरी कहानी नहीं है।

इन सी-तार कर रहे हैं। सी-पुस्तकालयों और funcctions में सम्मेलन गतिशील रूप से आवंटित स्ट्रिंग को वापस करने के लिए है जिसे मुक्त किया जाना चाहिए। यानी एक सूचक वापस लौटाया गया था, जो कॉलर को वापस स्वामित्व पास कर रहा था (जैसा कि सी में भी हम अपवाद हैं)।

आप इन परंपराओं का पालन नहीं करते हैं तो आपको लगता है कि इस सम्मेलन उम्मीद करेंगे अनुभवी सी डेवलपर्स के एक बहुत भ्रमित करेगा। यदि आप इस मानक अपेक्षा का पालन नहीं करते हैं तो इसे कोड में अच्छी तरह से प्रलेखित किया जाना चाहिए।

इसके अलावा इस C++ (अपने टैग के अनुसार)। इसलिए यह एक std :: स्ट्रिंग को वापस करने के लिए अधिक पारंपरिक है। इसका कारण यह है कि पॉइंटर्स के माध्यम से स्वामित्व को पारित करना केवल निहित है (और इससे सी कोड में बहुत सी त्रुटियों का कारण बनता है, उपर्युक्त उम्मीद टूट गई थी लेकिन दस्तावेज किया गया था, दुर्भाग्यवश दस्तावेज कोड को उपयोगकर्ता के कोड द्वारा कभी नहीं पढ़ा गया था)। एक std :: स्ट्रिंग का उपयोग करके आप किसी ऑब्जेक्ट को पास कर रहे हैं और उनका अब स्वामित्व का कोई प्रश्न नहीं है (परिणाम एक मूल्य के रूप में वापस किया गया है और इस प्रकार आपका), लेकिन क्योंकि यह एक वस्तु है क्योंकि संसाधन आवंटन के साथ कोई प्रश्न या समस्या नहीं है ।

आप दक्षता के बारे में चिंतित हैं, तो मुझे लगता है कि एक झूठी चिंता का विषय है।

std::cout << std::boolalpha << false << std::endl; 
std::cout << std::boolalpha << true << std::endl; 
संबंधित मुद्दे