वर्ग घोषणा ब्रेसिज़ के बाद अर्धविराम


82

सी ++ कक्षाओं में, समापन ब्रेस के बाद अर्ध-कोलन क्यों? मैं नियमित रूप से इसे भूल जाता हूं और संकलक त्रुटियां प्राप्त करता हूं, और इसलिए समय खो दिया है। कुछ हद तक मेरे लिए बहुत अच्छा लगता है, जो मामला होने की संभावना नहीं है। क्या लोग वास्तव में ऐसा करते हैं:

class MyClass
{
.
.
.
} MyInstance;

मैं इसे संरचना और एनम के लिए सी संगतता बिंदु से प्राप्त करता हूं, लेकिन चूंकि कक्षाएं सी भाषा का हिस्सा नहीं हैं, इसलिए मुझे लगता है कि यह मुख्य रूप से समान घोषणा निर्माणों के बीच निरंतरता बनाए रखता है।

मैं जो चाह रहा था, वह डिजाइनिंग औचित्य से संबंधित था बजाय कुछ भी बदलने में सक्षम होने के, हालांकि एक अच्छा कोड पूरा करने वाला आईडीई संकलन से पहले इसे फंसा सकता है।


4
यह मदद कर सकता है: cpptalk.net/…
माइकल हरेन

@ मिचेल, लिंक के लिए धन्यवाद। एक ऐतिहासिक दृष्टिकोण से यह अच्छी समझ में आता है, और यदि C ++ सभी C ग्रामर को अनुमति देता है, और C ++ वर्ग संरचना के साथ समान हैं, तो हमें कक्षा के अंत में आवश्यक अर्ध-बृहदान्त्र के साथ छोड़ दिया जाता है।
SmacL

3
@ ब्रायन, यूप गंभीर सवाल। मैं अच्छी तरह से जानता हूं कि मुझे इसके साथ रहना है लेकिन मैं डिजाइन और कार्यान्वयन के पीछे तर्क के बारे में उत्सुक हूं।
SmacL 24/09

ठीक है, लेकिन आपको संभवतः अपने प्रश्न को संपादित करना चाहिए ताकि आप डिजाइन तर्क को शामिल कर सकें। जैसा कि यह है, यह लोगों को "घुंघराले कंस क्यों" जैसे सवाल पूछने के लिए प्रोत्साहित करता है? :) आपको स्ट्रॉस्ट्रुप के डिजाइन और विकास C ++ पढ़ने में रुचि हो सकती है, हालांकि यह कक्षाओं के अंत में अर्ध-कॉलन की तुलना में अधिक वजन वाले मामलों को कवर करता है।
ब्रायन नील

@ ब्रायन, काफी उचित है, और यह सीमा रेखा के रूप में था कि क्या इसे विकि करना है या नहीं। एक बड़े बिल्ड में नियमित रूप से उपयोग किए गए हेडर में अर्ध-बृहदान्त्र को छोड़ने के बाद सवाल पूछा गया था। यह मुझे आधे घंटे का समय लगता है, इसलिए एसओ की यात्रा। आपके सुझाव के अनुसार संपादित किया गया प्रश्न।
14

जवाबों:


47

भाषा द्वारा एक प्रकार की घोषणा में समापन ब्रेस के बाद अर्ध-बृहदान्त्र की आवश्यकता होती है। यह सी के शुरुआती संस्करणों के बाद से इस तरह से है।

और हां, लोग जो घोषणा करते हैं, आप वहीं करते हैं। यह तरीकों के अंदर scoped प्रकार बनाने के लिए उपयोगी है।

void Example() {
  struct { int x; } s1;
  s1.x = 42;

  struct ADifferentType { int x; };
}

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


MyInstance को निर्दिष्ट किए बिना मैं सिर्फ स्कोप्ड प्रकार क्यों नहीं बना सकता? यह अजीब है कि आप दो क्रियाओं को जोड़ते हैं: नए प्रकार की घोषणा करना और नए चर की घोषणा करना।
मायकोला गोलूबेव

@ मायकोला आप दोनों कर सकते हैं। मेरे द्वारा जोड़े गए नमूने को देखें
JaredPar

71

लिंक @MichaelHaren द्वारा प्रदान प्रदान करने के लिए प्रकट होता है मूल कारण । सेमीकोलन (जैसा कि अन्य ने बताया है) सी से विरासत में मिला है लेकिन यह नहीं समझाता है कि सी ने पहले स्थान पर इसका इस्तेमाल क्यों किया। चर्चा में उदाहरण का यह रत्न शामिल है:

struct fred { int x; long y; }; 
main() 
{ 
  return 0; 
} 

C के पुराने संस्करणों में एक फ़ंक्शन से अंतर्निहित इंट रिटर्न प्रकार था जब तक कि अन्यथा घोषित न किया गया हो। यदि हम ;संरचना परिभाषा के अंत में चूक जाते हैं , तो हम न केवल एक नए प्रकार को परिभाषित कर रहे हैं fred, बल्कि यह भी घोषित कर रहे हैं कि इसका main()एक उदाहरण वापस आ जाएगा fred। यानी कोड इस तरह पार्स किया जाएगा:

struct fred { int x; long y; } main()
{ 
  return 0; /* invalid return type, expected fred type */
} 

1
हाँ अंतर्निहित int वापसी प्रकार सब कुछ यहाँ ऊपर होगा। अच्छा मणि
Gaspa79

17

मुझे लगता है कि यह इसलिए है क्योंकि कक्षाएं घोषणाएं हैं, तब भी जब उन्हें समूहीकरण के लिए ब्रेस की आवश्यकता होती है। और हाँ, वहाँ ऐतिहासिक तर्क है कि सी के बाद से आप कर सकते हैं

struct
{
  float x;
  float y;
} point;

आपको C ++ में एक समान कार्य करने में सक्षम होना चाहिए, यह classघोषणा के लिए उसी तरह से व्यवहार करने के लिए समझ में आता है ।


11

इसके लिए छोटा है

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

वर्ग घोषणा के घुंघराले ब्रेसिज़ के बाद अर्धविराम वास्तव में ओवरकिल है, लेकिन यह है कि सी ++ को कैसे परिभाषित किया जाता है। परिवर्तनीय घोषणा के बाद अर्धविराम की हमेशा आवश्यकता होती है और समझ में आता है।


1
तो, क्या C ++ को प्रत्येक घोषणा के बाद एक अर्ध-बृहदान्त्र की आवश्यकता होती है?
लाई नागती

1
ध्यान दें, इस तरह, आप एक अनाम वर्ग का ऑब्जेक्ट नहीं बना सकते हैं, जबकि आप दूसरे तरीके से कर सकते हैं।
केविन

5

मैं ऐसी घोषणाओं का उपयोग नहीं करता हूं

class MyClass
{
.
.
.
} MyInstance;

लेकिन इस मामले में मैं समझ सकता हूं कि वहां अर्धविराम क्यों है।
क्योंकि यह जैसा है int a;- वैरिएबल डिक्लेरेशन।

संभवतः संगति के लिए क्योंकि आप 'MyInstance' अर्धविराम को छोड़ सकते हैं।


3

structसंगतता कारणों के लिए इसकी आवश्यकता है, और आप इसे कैसे पसंद करेंगे:

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency

1
लेकिन इससे क्या namespace myNamespace { ... } // inconsistent but valid?
क्रिस के

3

सी / सी ++ में; एक बयान टर्मिनेटर है। सभी बयानों को समाप्त कर दिया गया है; अस्पष्टता से बचने के लिए (और पार्सिंग को आसान बनाने के लिए)। व्याकरण इस संबंध में सुसंगत है। भले ही एक वर्ग की घोषणा (या उस मामले के लिए कोई ब्लॉक) कई लाइनें लंबी हों और {} के साथ सीमांकित हो, यह अभी भी बस एक बयान है ({} बयान का हिस्सा है) इसलिए इसे समाप्त करने की आवश्यकता है; (; एक विभाजक / परिसीमनकर्ता नहीं है)

अपने उदाहरण में

class MyClass{...} MyInstance;

पूरा बयान है। एक ही बयान में घोषित वर्ग के कई उदाहरणों को परिभाषित किया जा सकता है

class MyClass{...} MyInstance1, MyInstance2;

यह एक कथन में एक आदिम प्रकार के कई उदाहरणों को घोषित करने के साथ पूरी तरह से संगत है:

int a, b, c;

कारण अक्सर वर्ग और उदाहरण के इस तरह के डिस्क्लेमर को नहीं देखता है, क्या इसका उदाहरण केवल हो सकता है? एक वैश्विक चर हो, और आप वास्तव में अक्सर वैश्विक वस्तुओं को नहीं चाहते हैं जब तक कि वे स्थिर और / या पुराने डेटा संरचनाएं न हों।


2
लेकिन फ़ंक्शन की परिभाषा एक बयान भी है लेकिन अर्धविराम के बिना।
जिआपेंग झांग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.