2010-03-17 11 views
7

मैं सी ++ प्रकार-सुरक्षित psuedo-enums की मेरी भयानक गड़बड़ी को नए सी ++ 0x प्रकार-सुरक्षित enums में दोबारा कर रहा हूं क्योंकि वे रास्ता अधिक पठनीय हैं। वैसे भी, मैं उन्हें निर्यात की कक्षाओं में उपयोग करते हैं, तो मैं स्पष्ट रूप से चिह्नित करें निर्यात किया जाना:जी ++ सी ++ 0 एक्स एनम क्लास कंपाइलर चेतावनी

enum class __attribute__((visibility("default"))) MyEnum : unsigned int 
{ 
    One = 1, 
    Two = 2 
}; 

जी के साथ ++ इस संकलन पैदावार निम्न चेतावनी: के बाद प्रकार पहले से ही

परिभाषित किया गया है पर ध्यान नहीं दिया

प्रकार गुण

यह बहुत ही अजीब लगता है, के बाद से जहाँ तक मुझे पता है, कि चेतावनी की तरह वास्तविक गलतियों को रोकने के लिए है:

class __attribute__((visibility("default"))) MyClass { }; 
class __attribute__((visibility("hidden"))) MyClass; 

बेशक, मैं स्पष्ट रूप से ऐसा नहीं कर रहा हूं, क्योंकि मैंने केवल enum class की परिभाषा पर दृश्यता विशेषताओं को चिह्नित किया है और मैं इसे फिर से परिभाषित या घोषित नहीं कर रहा हूं (मैं इस त्रुटि को डुप्लिकेट कर सकता हूं एक दस्तावेज)।

आखिरकार, मैं इस कोड को वास्तव में एक समस्या का कारण नहीं बना सकता, इस तथ्य के लिए बचा सकता हूं कि अगर मैं मूल्य बदलता हूं और साझा लाइब्रेरी को फिर से संकलित किए बिना उपभोक्ता को फिर से संकलित करता हूं, तो उपभोक्ता नया पास करता है मूल्यों और साझा लाइब्रेरी को पता नहीं है कि उनके साथ क्या करना है (हालांकि मैं पहले स्थान पर काम करने की अपेक्षा नहीं करता)।

क्या मैं बहुत पैडेंटिक हूं? क्या इसे सुरक्षित रूप से अनदेखा किया जा सकता है? मुझे ऐसा संदेह है, लेकिन साथ ही, यह त्रुटि होने से मुझे Werror के साथ संकलन करने से रोकता है, जो मुझे असहज बनाता है। मैं वास्तव में यह समस्या दूर जाना चाहूंगा।

उत्तर

3

आप चेतावनी बंद करने के लिए -Wno-attributes ध्वज पास कर सकते हैं।

(यह शायद जीसीसी में एक बग है?)

+1

मैं जीसीसी के बगजिला को बग की सूचना दी। –

+1

@TravisGockel: क्या आप मुझे उस टिकट पर इंगित कर सकते हैं? मैंने नीचे एक कामकाज पोस्ट किया है। – erenon

+0

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43407 – vpicaver

1

यह ++ जी के साथ 4.8.2 मेरे लिए काम करता निम्नलिखित तरीके:

enum class MyEnum : unsigned int 
__attribute__((visibility("default"))) 
{ 
    One = 1, 
    Two = 2 
}; 

(attribute घोषणा की स्थिति को बदलने)

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