मैंने बड़े प्रोग्राम के हिस्से के रूप में फ़ाइलों से डेटा पढ़ने के लिए कोड के निम्न भाग का उपयोग किया।डीरफ्रेंसिंग प्रकार-दंडित सूचक सख्त-एलियासिंग नियमों को तोड़ देगा
double data_read(FILE *stream,int code) {
char data[8];
switch(code) {
case 0x08:
return (unsigned char)fgetc(stream);
case 0x09:
return (signed char)fgetc(stream);
case 0x0b:
data[1] = fgetc(stream);
data[0] = fgetc(stream);
return *(short*)data;
case 0x0c:
for(int i=3;i>=0;i--)
data[i] = fgetc(stream);
return *(int*)data;
case 0x0d:
for(int i=3;i>=0;i--)
data[i] = fgetc(stream);
return *(float*)data;
case 0x0e:
for(int i=7;i>=0;i--)
data[i] = fgetc(stream);
return *(double*)data;
}
die("data read failed");
return 1;
}
अब मैं -O2
उपयोग करने के लिए बताया गया है और मैं जीसीसी चेतावनी निम्नलिखित हो: warning: dereferencing type-punned pointer will break strict-aliasing rules
Googleing मैं दो ओर्थोगोनल जवाब मिला:
बनाम
अंत मैं चेतावनी की अनदेखी नहीं करना चाहते हैं। आप क्या सुझाव देंगे?
[अद्यतन] मैंने वास्तविक कार्य के साथ खिलौना उदाहरण को प्रतिस्थापित किया।
आपका समारोह एक डबल लौटा रहा है, लेकिन आप एक int में अपनी वापसी कास्ट करें। डबल क्यों नहीं डाला? –
आपूर्ति किए गए लिंक का मेरा पठन: bytes.com लिंक अधिकतर गलत लगता है (वास्तव में जीसीसी 4.x जारी होने के बाद चीजें बदल गई हैं), जबकि SO लिंक ठीक प्रतीत होता है। मैं कर रहा हूँ एक सा त्रुटि संदेश से उलझन में क्योंकि मैंने सोचा अलियासिंग नियमों बाहर रखा गया 'char' प्रकार (यानी एक' char' सूचक हमेशा अन्य संकेत उर्फ करने के लिए अनुमति दी है, जब तक यह है 'प्रतिबंधित C99," 6.5 भाव ", खंड 7. – Dummy00001
देखें 'ed।) हो सकता है कि आपको इसे लागू करने के लिए इसे 'हस्ताक्षरित चार' बनाना होगा ..? मुझे सही जवाब देखने में दिलचस्पी होगी। –