2012-11-29 23 views
16

इस questionयह किस प्रकार की घोषणा है?

से विस्तार से मुझे इस कोड को समझने में समस्या हो रही है।

struct foo myfoo; // --> Is it forward declaration or object creation. ? 

struct foo 
{ 
int a; 
}; 

int main() 
{ 

return 0; 
} 

कोड चिह्नित तीर --> में यह आगे घोषित घोषणा या वस्तु निर्माण है। ?

यदि यह आगे की घोषणा है तो struct foo; क्या कहा जाता है? यदि यह ऑब्जेक्ट सृजन या तात्कालिकता है तो यह संरचना परिभाषा से पहले ऑब्जेक्ट कैसे बना सकता है।

gcc पर कंपाइलर ठीक काम कर रहा है लेकिन अन्य कंपाइलर त्रुटि देता है।

gcc -Werror -Wall tst.c -o tst 

gcc के इस व्यवहार के बारे में कोई सुझाव या स्पष्टीकरण? मैं दस्तावेज के रूप में इसे कहीं भी नहीं मिला।

+0

के बराबर मैं C99 मानक को देखने के लिए एक मौका नहीं मिला, तो मैं अभी भी यकीन है कि अगर यह नहीं कर रहा हूँ के साथ कहीं निर्दिष्ट, +1। – iabdalkader

+0

@melpomene: मैं – Omkant

+0

@melpomene, या शायद एक सुविधा पर सहमत हुए? ऐसा लगता है जैसे यह समझ रहा है कि बाद में उसी फ़ाइल में संरचना को परिभाषित किया गया है। – Shahbaz

उत्तर

16

myfoo की टेंटेटिव परिभाषा की तरह दिखता है और क्योंकि संरचना की परिभाषा प्रदान की जाती है तो आपको कोई त्रुटि नहीं मिलती है।

क्लैंग परिभाषित नहीं होने पर एक व्यापक निदान प्रदान करता है।

[email protected]:~$ cat tst.c 
struct foo myfoo; 

//struct foo{ 
// int x ; 
//} ; 

int main() 
{ 
} 
[email protected]:~$ clang tst.c 
tst.c:1:12: error: tentative definition has type 'struct foo' that is never 
     completed 
struct foo myfoo; 

मैं अपने एक जीसीसी बग नहीं लगता है, साथ ही बजना के रूप में comeau online कोड संकलन है है।

$ 6.9.2/2

एक भंडारण-वर्ग विनिर्देशन के बिना या भंडारण-वर्ग विनिर्देशक स्थिर साथ एक वस्तु एक प्रारंभकर्ता बिना गुंजाइश फ़ाइल है कि के लिए एक पहचानकर्ता के एक घोषणा, और, एक का गठन किया टेटेबेटिव परिभाषा। यदि एक अनुवाद इकाई में पहचानकर्ता के लिए एक या अधिक टेटात्मक परिभाषाएं हैं, और अनुवाद इकाई में उस पहचानकर्ता के लिए कोई बाहरी परिभाषा नहीं है, तो व्यवहार बिल्कुल वैसा ही है जैसे अनुवाद इकाई में पहचानकर्ता का फ़ाइल स्कोप घोषणा है, अनुवाद इकाई के अंत के रूप में मिश्रित प्रकार, एक प्रारंभकर्ता 0.


+4

अच्छी पकड़, सी 99 6.9.2/2। यह एक मुश्किल था (जब आप सामान्य रूप से सी ++ के लिए उपयोग किया जाता है)। – netcoder

+0

यह मजाकिया है कि मानक उनके उदाहरण में संरचना का उल्लेख नहीं करता है (न तो सी 11 में)। – Shahbaz

-2
struct foo myfoo; 

प्रकार foomyfoo कहा जाता है की एक सी चर परिभाषा है। सी आपको struct स्पष्ट रूप से struct परिवर्तनीय घोषणाओं के सामने स्पष्ट रूप से अवश्य बताएगा।

अब, आपका कोड संकलित नहीं होना चाहिए क्योंकि संकलक को आपके myfoo को परिभाषित करने के स्थान पर कोई जानकारी नहीं है, किस प्रकार का foo दिखता है। संकलक को अपूर्ण प्रकार होने के बारे में foo शिकायत करनी चाहिए।

संपादित करें:

स्क्रैप कि, यह एक जांच परिभाषा ही कहा जाता है।

+5

मुझे नहीं लगता कि आप पूरी तरह से प्रश्न पढ़ते हैं। – Shahbaz

+0

§6.9.2/2 में टेंटेटिव परिभाषाएं "अनुवाद इकाई के अंत के रूप में समग्र प्रकार के साथ" समाप्त होती हैं, मेरा मानना ​​है कि इस प्रश्न में हमारे पास यही है। – Mat

+0

क्या "संगतता मोड" है? सी मानक में टिकाऊ परिभाषाओं का वर्णन किया गया है। – Mat

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