मैं MinGW जीसीसी 4.4.0 में कुछ C++ कोड संकलन कर रहा हूँ, और निम्न फार्म के साथ चेतावनी मिल ...ऑफ़सेट के इस उपयोग के साथ क्या गलत है?
warning: invalid access to non-static data member '<membername>' of NULL object
warning: (perhaps the 'offsetof' macro was used incorrectly)
यह समस्या लगता है परिचित - कुछ मैंने पहले हल करने की कोशिश की और विफल रहा है, मैं सोचो, लेकिन थोड़ी देर पहले। कोड विजुअल सी ++ में ठीक बनाता है, लेकिन मैंने हाल ही में किसी अन्य कंपाइलर में यह विशेष कोड नहीं बनाया है।
समस्या कोड निम्न टेम्पलेट है ...
template<typename T>
class c_Align_Of
{
private:
struct c_Test
{
char m_Char;
T m_Test;
};
public:
enum { e_Align = offsetof (c_Test, m_Test) };
};
जाहिर है मैं शायद कुछ सशर्त संकलन इस के लिए संकलक विशिष्ट कार्यों का उपयोग करने के लिए उपयोग कर सकते हैं, और मेरा मानना है कि C++ 0x (पर लंबी होगा पिछले) इसे अनावश्यक बनाओ। लेकिन किसी भी मामले में, मैं offsetof
के इस उपयोग के साथ कुछ भी गलत नहीं देख सकता।
बहुत pedantically, यह है कि क्योंकि T
पैरामीटर प्रकार कभी कभी गैर पॉड हैं, इसलिए जीसीसी कक्षाएं c_Test
रूप में गैर-पॉड संभव है और शिकायत (और शिकायत और शिकायत - मैं हो रही है इन चेतावनियों के लगभग 800 लाइनों) ।
यह मानक की सख्त शब्दावली से शरारती है, क्योंकि गैर-पीओडी प्रकार offsetof
तोड़ सकते हैं। हालांकि, इस तरह के गैर-पीओडी अभ्यास में कोई समस्या नहीं होनी चाहिए - c_Test
में वर्चुअल टेबल नहीं होगा, और m_Test
के ऑफसेट को खोजने के लिए कोई रन-टाइम ट्रिकरी की आवश्यकता नहीं है।
इसके अलावा, भले ही c_Test
में वर्चुअल टेबल था, जीसीसी एक आंतरिक का उपयोग करके ऑफसेट मैक्रो लागू करता है जिसे हमेशा उस विशेष प्रकार के स्थिर लेआउट के आधार पर संकलन-समय पर मूल्यांकन किया जाता है। एक उपकरण प्रदान करना, जब भी इसका इस्तेमाल किया जाता है, हर समय मूर्खतापूर्ण लगता है (क्षमा करें, चेतावनी)।
इसके अलावा, मैं केवल एक ही व्यक्ति यहाँ जो बात इस तरह का नहीं हूँ ...
Answer to legit-uses-of-offsetof question
मुझे क्या करना याद कारण इस तरह का के लिए offsetof
साथ कोई समस्या आ, लेकिन मुझे नहीं लगता समस्या यह टेम्पलेट था।
कोई विचार?
क्या आप उन पीओडी-प्रकारों के लिए एक उदाहरण जोड़ सकते हैं जो समस्या को पुन: उत्पन्न करते हैं? –
@ जॉर्ज - कोई बात नहीं - मैं सीधे सोच नहीं रहा था। उनके पास रचनाकार थे और इस प्रकार गैर-पीओडी थे। नीचे जवाब देखें। – Steve314