ভিসির জন্য, এখানে ফরওয়ার্ড ডিক্লেয়ারেশন এবং অন্তর্নিহিত ধরণের নির্দিষ্টকরণ সম্পর্কে পরীক্ষা করা হয়:
- নিম্নলিখিত কোড ঠিক আছে সংকলিত হয়।
টাইপিড ইনট মাইনিট;
এনাম টি;
অকার্যকর foo (টি * টিপি)
{
* টিপি = (টি) 0x12345678;
}
এনাম টি: চর
{
একজন
};
তবে / ডাব্লু 4 এর জন্য সতর্কতা পেয়েছে (/ ডাব্লু 3 এই সতর্কতাটি জড়িত নয়)
সতর্কতা C4480: নন-স্ট্যান্ডার্ড এক্সটেনশন ব্যবহৃত হয়েছে: এনাম 'টি' এর জন্য অন্তর্নিহিত ধরণ নির্দিষ্ট করে
উপাচার্য (মাইক্রোসফ্ট (আর) 32-বিট সি / সি ++ 80x86 এর জন্য 15.00.30729.01 সংকলক সংস্করণ অনুকূলিত করা উপরের ক্ষেত্রে বগি দেখাচ্ছে:
- এনাম টি দেখার সময়; ভিসি এনাম টাইপ টি অনুমান করে যে অন্তর্নিহিত টাইপ হিসাবে ডিফল্ট 4 বাইট ইনট ব্যবহার করে, তাই উত্পন্ন সমাবেশের কোডটি হ'ল:
? foo @@ YAXPAW4T @@@ Z PROC; foo বিন্যাস
; ফাইল ই: \ work \ c_cpp \ cpp_snippet.cpp
; লাইন 13
ebp ধাক্কা
Mov ebp, esp
; লাইন 14
মুভ ইক্স, ডিওয়ার্ড পিটিআর _টিপি t [ইবিপি]
মুভ ডিওয়ার্ড পিটিআর [ইক্স], 305419896; 12345678H
; লাইন 15
পপ ebp
ret 0
? foo @@ YAXPAW4T @@@ জেড এন্ডপি; foo বিন্যাস
উপরের অ্যাসেম্বলি কোডটি আমার / ব্যক্তিগতভাবে অনুমান না করে সরাসরি /First.asm থেকে বের করা হয়। আপনি কি মুভ ডিওয়ার্ড পিটিআর দেখতে পাচ্ছেন [eax], 305419896; 12345678H লাইন?
নিম্নলিখিত কোড স্নিপেট এটি প্রমাণ করে:
ইন্ট মেইন (ইন্ট আরজিসি, চর * আরজিভি)
{
মিলন {
চর সিএ [4];
টি টি;
} একটি;
a.ca [0] = a.ca [1] = ক। [সিএ [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
নোটটি ওভাররাইট করা হচ্ছে না
সুতরাং ভিসিতে এনামের ফরওয়ার্ড-ডিক্লেয়ারেশন ব্যবহার ক্ষতিকারক হিসাবে বিবেচিত হয়।
বিটিডাব্লু, অবাক হওয়ার মতো বিষয় নয় যে অন্তর্নিহিত ধরণের ঘোষণার জন্য সিনট্যাক্সটি সি # তে রয়েছে। প্রাইসিসে আমি এমবেডেড সিস্টেমের সাথে কথা বলার সময় অন্তর্নিহিত ধরণের উল্লেখ করে 3 বাইট সংরক্ষণ করার উপযুক্ত বলে মনে করি যা স্মৃতি সীমাবদ্ধ।