2009-09-04 20 views
7

क्या संकलन समय पर संरचना के सदस्य की ऑफसेट खोजने का कोई तरीका है? मैं एक संरचना सदस्य के ऑफसेट युक्त निरंतर बनाना चाहता हूं। निम्नलिखित कोड में offsetof() मैक्रो पहले printf कथन में काम करता है।संकलन समय पर ऑफसेट करें

"Cannot resolve '->' operator as a constant expression".

वहाँ यह कर के किसी भी अन्य रास्ता नहीं है: हालांकि, लाइन 10 में उपयोग के घोषित करने के लिए त्रुटि उत्पन्न?

struct MyStruct 
{ 
    unsigned long lw; 
    unsigned char c[5]; 
    int i; 
    int j; 
    unsigned long last; 
}; 

const int ofs = offsetof(struct MyStruct, i); // This line in error 

int main(void) 
{ 
    printf("Offset of c = %d.\n", offsetof(struct MyStruct, c)); 
    printf("Offset of i = %d.\n", ofs); 
    return 0; 
} 

उत्तर

4

यह उचित # समावेशन जोड़ने के बाद, g ++ 4 के साथ चेतावनी के बिना संकलित करता है।

क्या आप # stddef.h शामिल हैं? offsetof() एक मैक्रो है, सी

यदि कोई फिक्स नहीं करता है, तो इसे स्थिर करने के लिए, स्थिर मॉड्यूल को मॉड्यूल में सीमित करने का प्रयास करें। इससे कंपाइलर खुश हो सकता है।

9

ऑफ़सेट() मैक्रो एक संकलन-समय निर्माण है। इसे परिभाषित करने के लिए कोई मानक-अनुरूप तरीका नहीं है, लेकिन प्रत्येक कंपाइलर के पास ऐसा करने का कोई तरीका होना चाहिए।

एक उदाहरण होगा:

#define offsetof(type, member) ((size_t) &(((type *) 0)->member)) 

जबकि निर्माण तकनीकी रूप से (टिप्पणियों को देखने के उपयोगकर्ता "litb" द्वारा), हर संकलक यह है कि कम से कम एक ऐसी अभिव्यक्ति होना आवश्यक है एक संकलन समय नहीं किया जा रहा संकलन समय पर हल करने में सक्षम है, जो वास्तव में offsetof() को <stddef.h> में परिभाषित किया गया है।

शायद आपके कोड में कुछ अन्य त्रुटि है - <stddef.h>, या आपके कंपाइलर को परेशान करने वाली कुछ अन्य चीज़ों में शामिल हैं।

+0

यह निश्चित रूप से "संकलन समय" के साथ इसका मतलब नहीं है। आप एक ऐसा निर्माण दिखाते हैं जो लाइब्रेरी फ़ंक्शन का उपयोग नहीं करता है, लेकिन इसका मतलब यह नहीं है कि यह संकलन समय मान का मूल्यांकन करता है। वास्तव में कोड उत्सर्जित किया गया है या नहीं, पाठ्यक्रम का अप्रासंगिक है - सी मसौदा कहता है "एक अंकगणितीय निरंतर अभिव्यक्ति में अंकगणितीय प्रकार होगा और केवल ऑपरेंड होंगे जो पूर्णांक स्थिरांक, फ़्लो ओटिंग स्थिरांक, गणना स्थिरांक, चरित्र स्थिरांक, और आकार के अभिव्यक्ति हैं।" मिश्रण में पॉइंटर्स की अनुमति नहीं है। –

+0

'ऑफसेटोफ 'एक संकलन समय एक पूर्णांक निरंतर अभिव्यक्ति का निर्माण और मूल्यांकन करता है, लेकिन आपका उदाहरण कार्यान्वयन नहीं करता है। –

+0

ऑफसेट() को परिभाषित करने के लिए भाषा में * नहीं * तरीका है जो एक पूर्णांक निरंतर अभिव्यक्ति का मूल्यांकन करता है। पॉइंटर्स का उपयोग किये बिना इसे परिभाषित करने के लिए * नहीं * तरीका है। कोई फर्क नहीं पड़ता कि आप क्या करते हैं, आप हमेशा अपनी अभिव्यक्ति को अनुकूलित करने के लिए संकलक की क्षमता और/या संकलक की क्षमता पर भरोसा करेंगे। ऑफसेट, या किसी भी ओपन-सोर्स सी लाइब्रेरी पर विकिपीडिया की जांच करें। इसलिए, जब आप पूर्णांक निरंतर अभिव्यक्तियों की परिभाषा पर तकनीकी रूप से सही होते हैं (और मैं अपना शब्द अनुकूलित करता हूं), तो आप मेरे उदाहरण कार्यान्वयन पर उंगली को इंगित करने में गलत हैं। – DevSolar

3

यदि आपके पास #include <stddef.h> है जैसा कि मुझे लगता है (आपके द्वारा उद्धृत त्रुटि संदेश अर्थहीन होगा), यह आपके कंपाइलर में एक बग है। offsetof परिणाम सी 99 के साथ-साथ सी 0 9 में एक पूर्णांक निरंतर अभिव्यक्ति है।

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