वीसी के लिए, यहां आगे की घोषणा और अंतर्निहित प्रकार को निर्दिष्ट करने के बारे में परीक्षण है:
- निम्नलिखित कोड ठीक संकलित किया गया है।
typedef int myint;
एनम टी;
शून्य फू (टी * टीपी)
{
* tp = (T) 0x12345678;
}
एनम टी: चार
{
ए
};
लेकिन / W4 के लिए चेतावनी मिली (/ W3 इस चेतावनी को लाइक नहीं)
चेतावनी C4480: गैरमानक एक्सटेंशन का उपयोग किया गया: एनम 'टी' के लिए अंतर्निहित प्रकार निर्दिष्ट करना
उपर्युक्त मामले में VC (Microsoft (R) 32-बिट C / C ++ ऑप्टिमाइज़िंग कंपाइलर संस्करण 15.00.30729.01 80x86 के लिए छोटी गाड़ी है):
- जब देखकर एनम टी; वीसी मान लेता है कि एनम टाइप T डिफ़ॉल्ट 4 बाइट्स का उपयोग अंतर्निहित प्रकार के रूप में करता है, इसलिए उत्पन्न विधानसभा कोड है:
; foo @@ YAXPAW4T @@@ Z PROC; foo
; फ़ाइल e: \ work \ c_cpp \ cpp_snippet.cpp
; पंक्ति १३
धक्कामुक्की
मूव एबप, एस्प
; लाइन 14
Mov eax, DWORD PTR _tp $ [ebp]
Mov DWORD PTR [eax], 305419896; 12345678H
; पंक्ति 15
पॉप ईबे
रिटायर ०
; foo @@ YAXPAW4T @@@ Z ENDP; foo
उपरोक्त विधानसभा कोड को सीधे मेरे व्यक्तिगत अनुमान से नहीं, बल्कि /Fatest.asm से निकाला जाता है। क्या आप Mov DWORD PTR [eax], 305419896 देखते हैं; 12345678H लाइन?
निम्नलिखित कोड स्निपेट यह साबित करता है:
int main (int argc, char * argv)
{
संघ {
चार सीए [4];
टी टी;
}ए;
a.ca [0] = a.ca [1] = a। [ca [2] = a.ca [3] = 1;
foo (& a.t);
प्रिंटफ ("% # x,% # x,% # x,% # x \ n", a.ca [0], a.ca [1], a.ca [2], a.ca [3]) ;
वापसी 0;
}
परिणाम है: 0x78, 0x56, 0x34, 0x12
- एनम टी की आगे की घोषणा को हटा दें और एनुम टी की परिभाषा के बाद फ़ंक्शन फू की परिभाषा को स्थानांतरित करें: परिणाम ठीक है:
उपरोक्त प्रमुख अनुदेश बन जाता है:
Mov BYTE PTR [eax], 120; 00000078H
अंतिम परिणाम है: 0x78, 0x1, 0x1, 0x1
ध्यान दें कि मूल्य ओवरराइट नहीं किया जा रहा है
इसलिए वीसी में एनम की फॉरवर्ड-घोषणा का उपयोग करना हानिकारक माना जाता है।
BTW, आश्चर्य नहीं करने के लिए, अंतर्निहित प्रकार की घोषणा के लिए सिंटैक्स सी # में समान है। प्रैटिस में मैंने पाया कि अंतर्निहित सिस्टम से बात करते समय अंतर्निहित प्रकार को चार के रूप में निर्दिष्ट करके 3 बाइट को बचाने के लायक है, जो कि मेमोरी सीमित है।