2011-04-18 21 views
6

मैं वास्तव में उलझन में हूँ। मैं बीजे ++ पीएल को बजेर्न स्ट्रॉस्ट्रप द्वारा पढ़ रहा हूं (विशेष संस्करण, 1 9वीं प्रिंट - सितंबर 2010)। मुझे किताब का एक हिस्सा उद्धृत, मेरे भ्रम की स्थिति पर प्रकाश डाला करते हैं:एक टाइपिफ़ परिभाषा है?

char ch; 
string s; 
int count = 1; 
const double pi = 3.1415926535897932385; 
extern int error_number; 

const char* name = "Njal"; 
const char* season[] = { "spring", "summer", "fall", "winter" }; 

struct Date { int d, m, y; }; 
int day(Date* p) { return p->d; } 
double sqrt(double); 
template<class T> T abs(T a) { return a<0 ? -a : a; } 

typedef complex<short> Point; 
struct User; 
enum Beer { Carlsberg, Tuborg, Thor }; 
namespace NS { int a; } 

के रूप में इन उदाहरणों से देखा जा सकता है, एक घोषणा बस सहयोगी एक नाम के साथ एक से अधिक प्रकार कर सकते हैं। इनमें से अधिकतर घोषणाएं भी परिभाषाएं हैं; यह है कि, वे उस नाम के लिए एक इकाई को भी परिभाषित करते हैं, जिसे वे संदर्भित करते हैं। Ch, के लिए इकाई एक चर के रूप में उपयोग करने के लिए स्मृति की उचित मात्रा है - स्मृति आवंटित की जाएगी। दिन के लिए यह निर्दिष्ट कार्य है। स्थिर पीआई के लिए, यह मान 3.1415926535897932385 है। तिथि के लिए, वह इकाई एक नया प्रकार है। प्वाइंट के लिए यह टाइप कॉम्प्लेक्स है ताकि प्वाइंट जटिल के लिए समानार्थी हो।

double sqrt(double); 
extern int error_number; 
struct User; 
typedef complex<short> Point <-- WTF; 

नहीं है, यह नीचे दी गई सूची के साथ बोल्ड परस्पर विरोधी में वाक्य: ऊपर घोषणाओं में से सिर्फ इन नहीं भी परिभाषाएं दी गई हैं? क्या टाइपिफ़ सिर्फ एक घोषणा या परिभाषा है? क्या यह पुस्तक में एक त्रुटि है?

+1

'Bjarne-stroustrup' एक टैग अब है? –

+0

ऐसा लगता है कि यह थोड़ी देर के लिए एक टैग रहा है। –

उत्तर

6

हालांकि मैं इस से पूरी तरह उलझन में हूं। मानक स्पष्ट है। Typedef सिर्फ एक घोषणा है। परिभाषा नहीं

3.1-2

एक घोषणा एक परिभाषा जब तक यह समारोह के शरीर (8.4) निर्धारित किए बिना ही एक समारोह की घोषणा की है, यह निर्वासन विनिर्देशक (7.1.1) या एक में शामिल है लिंकेज-विनिर्देश 24) (7.5) और न तो एक प्रारंभकर्ता और न ही फ़ंक्शन-बॉडी, यह कक्षा घोषणा (9.4) में एक स्थिर डेटा सदस्य घोषित करता है, यह एक वर्ग नाम घोषणा (9.1) है, या यह एक हैटाइपपीफ घोषणा (7.1.3), उपयोग-घोषणा (7.3.3), या उपयोग-निर्देश (7.3.4) का उपयोग कर।

संपादित करें: ओह, मुझे अभी एहसास हुआ क्यों। आप एक घोषणा टाइप कर सकते हैं, इसलिए एक टाइपिफ़ को खुद ही घोषणा करनी होगी।

+0

वास्तव में टाइपिफ़ बस एक पर्याय का परिचय देता है, और आपको समानार्थी को तुरंत चालू करने की आवश्यकता नहीं है। –

0

एक परिभाषा एक वस्तु बनाता है, इसलिए:

int x; 

किसी पूर्णांक एक्स कहा जाता है की एक परिभाषा है। एक टाइपिफ़ एक ऑब्जेक्ट नहीं बनाता है, यह मौजूदा प्रकार के लिए एक नया नाम बनाता है, इसलिए यह परिभाषा नहीं है।

+1

'संरचना दिनांक {int डी, एम, वाई; }; 'कोई ऑब्जेक्ट नहीं बनाता है - यह अभी भी एक (प्रकार) परिभाषा है। – sepp2k

+0

आपको क्या लगता है कि परिभाषा को एक वस्तु बनाना चाहिए? इनलाइन फ़ंक्शन की परिभाषा अभी भी परिभाषा नहीं बन सकती है। एक वर्ग की परिभाषा भी कुछ भी नहीं बना सकती है। किसी ऑब्जेक्ट की परिभाषा केवल एक वस्तु बनाती है। –

2

एक टाइपिफ़ एक प्रकार का उपनाम है, न कि स्वयं के लिए एक नया प्रकार। टाइपिफ़ के साथ, कुछ भी नया परिभाषित नहीं किया गया है, बल्कि एक मौजूदा परिभाषा को दूसरा नाम दिया गया है - जैसे नाइटक्रैकर आपका उपनाम है, न कि आपका असली नाम, लेकिन वे दोनों एक ही इकाई को संदर्भित करते हैं: आप।

+0

टाइप उपनाम जैसी कोई चीज़ नहीं है। –

+0

@Let_Me_Be - आप इसे कैसे कॉल करेंगे, फिर ("टाइप टाइपिफ़ टाइप करें" या इस तरह sth को छोड़कर)? –

+0

@Let_Me_Be: आपका क्या मतलब है? एक उपनाम कुछ के लिए एक और नाम है। और यह वही है जो एक टाइपिफ़ है, एक प्रकार के लिए एक और नाम। –

1

आप एक घोषणा और घोषणा के बीच एक अंतर कैसे बताते हैं?

आसान: आप प्रत्येक इकाई के केवल, लेकिन जितनी चाहें उतनी घोषणाएं कर सकते हैं।

क्योंकि आप कह सकते हैं

typedef int Foo; 
typedef int Foo; 
बिना किसी समस्या के

, यह एक परिभाषा नहीं है। या शायद क्योंकि यह परिभाषा नहीं है, आप यह कह सकते हैं। किसी भी तरह से, आपका कंपाइलर आसानी से बता सकता है कि कौन सा है।

ध्यान दें कि सी में यह एक typedef दोहराने के लिए गैर कानूनी है, तो एक typedef घोषणा सी में एक परिभाषा है

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