2012-10-09 14 views
89

मैं हाल ही में कुछ कोड को संशोधित किया गया था, और एक समारोह के भीतर एक लाइन पर एक पूर्व मौजूदा बग मिला:'std :;' क्या होगा सी ++ में करते हैं?

std:;string x = y; 

इस कोड को अभी भी संकलित करता है तथा अपेक्षा के अनुरूप काम कर रहा है।

स्ट्रिंग परिभाषा काम करती है क्योंकि यह फ़ाइल using namespace std; है, इसलिए std:: पहले स्थान पर अनावश्यक था।

सवाल यह है कि std:; संकलन क्यों है और क्या, यदि कुछ भी हो रहा है?

+1

@Xeo: उन्होंने सवाल में कहा कि उन्होंने नामस्थान std का उपयोग किया है; '। –

+0

@Fred: Derp! उस भाग को कोड के रूप में चिह्नित नहीं किया गया था, इसलिए मैंने इसे अनदेखा कर दिया। :) मैं अभी भी [इस सवाल] को इंगित करना चाहता हूं (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-cononsidered-a-bad-practice-in-c), तथापि। – Xeo

+23

वही कारण है कि 'http: // www.stackoverflow.com' संकलित करता है ... –

उत्तर

90

std: इसका लेबल, goto के लिए लक्ष्य के रूप में प्रयोग योग्य है।

जैसा कि @ एडम रोसेनफील्ड द्वारा एक टिप्पणी में इंगित किया गया है, यह एक कानूनी लेबल नाम है।

सी ++ 03 §6.1/1:

लेबल अपने स्वयं के नाम की जगह है और अन्य पहचानकर्ता साथ हस्तक्षेप नहीं करते।

+0

क्या यह एक कानूनी गोटो लेबल है? –

+0

@ जॉन डीबलिंग: निश्चित रूप से, क्यों नहीं? –

+0

मानक द्वारा आरक्षित? –

32

यह एक लेबल है, जिसके बाद एक खाली कथन x की घोषणा के बाद एक लेबल है।

12

इसका एक लेबल जो स्ट्रिंग

8
(expression)std: (end of expression); (another expression)string x = y; 
+4

व्याकरण के अनुसार, यह वास्तव में एक '(लेबल-) कथन' है, न कि 'अभिव्यक्ति'। – GManNickG

+0

ओह हाँ आप सही हैं मेरा मतलब है कि वे अलग हो गए हैं .. – Polymorphism

1

संकलक आपको बताता है कि क्या चल रहा है द्वारा पीछा किया जाता:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label] 
    std:;cout << "Hello!" << std::endl; 
    ^~~~ 
1 warning generated. 
:

#include <iostream> 
using namespace std; 
int main() { 
    std:;cout << "Hello!" << std::endl; 
} 

दोनों जीसीसी और बजना एक बहुत स्पष्ट चेतावनी दे

इस कहानी से दूर ले जाएं: हमेशा अपने कोड को चेतावनी के साथ संकलित करें जीएस सक्षम (उदा। -Wall)।

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