क्या संकलन समय पर संरचना के सदस्य की ऑफसेट खोजने का कोई तरीका है? मैं एक संरचना सदस्य के ऑफसेट युक्त निरंतर बनाना चाहता हूं। निम्नलिखित कोड में 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;
}
यह निश्चित रूप से "संकलन समय" के साथ इसका मतलब नहीं है। आप एक ऐसा निर्माण दिखाते हैं जो लाइब्रेरी फ़ंक्शन का उपयोग नहीं करता है, लेकिन इसका मतलब यह नहीं है कि यह संकलन समय मान का मूल्यांकन करता है। वास्तव में कोड उत्सर्जित किया गया है या नहीं, पाठ्यक्रम का अप्रासंगिक है - सी मसौदा कहता है "एक अंकगणितीय निरंतर अभिव्यक्ति में अंकगणितीय प्रकार होगा और केवल ऑपरेंड होंगे जो पूर्णांक स्थिरांक, फ़्लो ओटिंग स्थिरांक, गणना स्थिरांक, चरित्र स्थिरांक, और आकार के अभिव्यक्ति हैं।" मिश्रण में पॉइंटर्स की अनुमति नहीं है। –
'ऑफसेटोफ 'एक संकलन समय एक पूर्णांक निरंतर अभिव्यक्ति का निर्माण और मूल्यांकन करता है, लेकिन आपका उदाहरण कार्यान्वयन नहीं करता है। –
ऑफसेट() को परिभाषित करने के लिए भाषा में * नहीं * तरीका है जो एक पूर्णांक निरंतर अभिव्यक्ति का मूल्यांकन करता है। पॉइंटर्स का उपयोग किये बिना इसे परिभाषित करने के लिए * नहीं * तरीका है। कोई फर्क नहीं पड़ता कि आप क्या करते हैं, आप हमेशा अपनी अभिव्यक्ति को अनुकूलित करने के लिए संकलक की क्षमता और/या संकलक की क्षमता पर भरोसा करेंगे। ऑफसेट, या किसी भी ओपन-सोर्स सी लाइब्रेरी पर विकिपीडिया की जांच करें। इसलिए, जब आप पूर्णांक निरंतर अभिव्यक्तियों की परिभाषा पर तकनीकी रूप से सही होते हैं (और मैं अपना शब्द अनुकूलित करता हूं), तो आप मेरे उदाहरण कार्यान्वयन पर उंगली को इंगित करने में गलत हैं। – DevSolar