2013-07-29 10 views
12

मैं इस चेतावनी संदेश दिखाई जब संकलन (जीसीसी 4.6.3, ubuntu) उदाहरण:सी ++ चेतावनी: इस्तेमाल किया कोई संबंध के साथ अनाम प्रकार की घोषणा करने के चर

struct { 
} a; 

int main() 
{ 
} 


warning: anonymous type with no linkage used to declare variable ‘<anonymous struct> a’ with linkage [enabled by default]. 

जीसीसी यह चेतावनी नहीं देता है। केवल जी ++ करता है।

static struct { 
} a; 

मैं समझ नहीं सकता है कि इसका क्या मतलब, expecially क्यों typelinkage से संबंधित है:

जोड़ना स्थिर चेतावनी साफ करता है। मैंने सोचा कि जुड़ाव कहां और कैसे एक चर घोषित किया जाता है, पर निर्भर करता है, लेकिन चर के प्रकार पर नहीं।

+1

संबंधित ?? http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41970 – billz

+2

यदि मेरा या अन्य उत्तर आपको मदद करता है तो आपको स्वीकार करना चाहिए, मैंने देखा है कि आपने केवल एक जवाब स्वीकार कर लिया है, अगर आप लोगों को जवाब स्वीकार नहीं करते हैं आपके प्रश्नों का उत्तर देने की संभावना कम होगी – aaronman

उत्तर

8

त्रुटि यह है कि आप एक चर a घोषित करते हैं जिसमें अज्ञात प्रकार है (संरचना के बाद कोई टाइपनाम नहीं है)। मुझे लगता है कि चेतावनी है क्योंकि आप उस प्रकार के एक चर को फिर से घोषित नहीं कर सकते (अस्वीकरण का उपयोग किए बिना)। मुझे लगता है कि g++ चेतावनी देता है और gcc नहीं क्योंकि सी ++ एक कठोर भाषा है। मैंने इसे clang++ और clang के साथ भी परीक्षण किया और वे -Wall के साथ भी कोई चेतावनी नहीं देते हैं।

मुझे लगता है कि स्थैतिक चेतावनी से छुटकारा पाता है क्योंकि इसका उपयोग केवल उस फ़ाइल में किया जा सकता है (जिसका कोई बाहरी संबंध नहीं है), a को एक अलग फ़ाइल में उपयोग करना मुश्किल होगा क्योंकि आप इसे टाइप नहीं करेंगे या इसके सदस्यों तक पहुंच है।

संपादित करें: दुर्भाग्यवश चेतावनी में link के अनुसार वास्तव में एक बग (हालांकि मामूली) है और इसे ठीक कर दिया गया है।

+2

माना जाता है कि लिंक @ बिल्ज़ के अनुसार यह वास्तव में एक बग है, चित्र – aaronman

12

इसका क्या अर्थ है कि परिवर्तनीय a संबंध है, उदाहरण के लिए अन्य अनुवाद इकाइयों में दिखाई दे सकता है। हालांकि इसके अज्ञात प्रकार में केवल आंतरिक संबंध है (कोई [बाहरी] लिंकेज) ताकि आप वास्तव में किसी भी अन्य अनुवाद इकाई में परिवर्तनीय a तक पहुंच नहीं सकें क्योंकि आप इसके प्रकार तक नहीं पहुंच सकते हैं।

परिवर्तनीय स्थैतिक बनाना इसे आंतरिक लिंकेज देगा और इसलिए न तो प्रकार और न ही चर अन्य अनुवाद इकाइयों में दिखाई देगा।

मुझे यकीन है कि इस परिदृश्य में एक अज्ञात नेमस्पेस एक ही उद्देश्य की सेवा करेगा, तो मुझे यकीन नहीं है कि (जांचने के लिए कंपाइलर तक कोई पहुंच नहीं है)।

+1

पर जाएं मेरा उत्तर समान है, भले ही आपका वाक्यांश बेहतर हो, लेकिन ओपी पर एक टिप्पणी के मुताबिक यह वास्तव में है बग, एक लिंक है – aaronman

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