নিম্নলিখিত সি ++ কোড বিবেচনা করুন:
void* a = &a;
সংকলক কেন অঘোষিত শনাক্তকারী ব্যবহারের জন্য অভিযোগ করে না?
এছাড়াও, সংকলকটি পরিবর্তনশীলটিকে কী বলে মনে করে a? এটি একটি শূন্য বস্তুর পয়েন্টার বা এটি কোনও পয়েন্টারটির void*পয়েন্টার?
নিম্নলিখিত সি ++ কোড বিবেচনা করুন:
void* a = &a;
সংকলক কেন অঘোষিত শনাক্তকারী ব্যবহারের জন্য অভিযোগ করে না?
এছাড়াও, সংকলকটি পরিবর্তনশীলটিকে কী বলে মনে করে a? এটি একটি শূন্য বস্তুর পয়েন্টার বা এটি কোনও পয়েন্টারটির void*পয়েন্টার?
উত্তর:
সি ++ এ ভেরিয়েবল ঘোষণার সুযোগটি বিস্ময়কর হতে পারে:
void* a = &a;
^~~~~~~~~~~~~~~~~
a declared as `void*` from here on
অতএব, &aহয় void**কিন্তু কোনো পয়েন্টার টাইপ যেহেতু পরোক্ষভাবে থেকে পরিবর্তনীয় হয় void*...
a = &userfulObject?
void *a = a;স্থানীয়ভাবে ঘোষণা করা হলে এটি ইউবি হবে, অন্যথায় নাম স্পেসে এটি ঠিক আছে।
এটা সমান
void* a;
a = &a;
সুতরাং, aঘোষণা করা হয়েছে। সুতরাং লিখিত aঠিকানা পায় । সুতরাং এটি একটি অকার্যকর পয়েন্টার একটি পয়েন্টার। (আপনি এখনও কোনও বস্তুর সংজ্ঞা দেননি।)aa
aনিজেই একটি বস্তু। (সমস্ত অবজেক্টের সি
ইন void* a, aকোনও voidধরণের নয় বরং "যে কোনও" টাইপের (বিশেষ ক্ষেত্রে) নির্দেশক হিসাবে ঘোষণা করা হয় । একটি ঠিকানা (স্মৃতিতে অবস্থান) নির্ধারিত হয়a , অবশ্যই অন্য যে কোনও ভেরিয়েবল ঘোষিত হচ্ছে।
এর পরে, &aভেরিয়েবলটি আরম্ভ করার জন্য এক্সপ্রেশনটি মূল্যায়ন করা হয় (এছাড়াও a, তবে এটি প্রাসঙ্গিক নয়) সবেমাত্র ঘোষিত হয়েছে। প্রকারটি &aহ'ল "যে কোনও ধরণের পয়েন্টার থেকে পয়েন্টার", যা "প্রকারের সাথে কোনও প্রকারের" একটি বিশেষ ক্ষেত্রে, প্রকারের সাথে পুরোপুরি সামঞ্জস্যপূর্ণ a। কিন্তু, কোনও সংকলক বার্তা নেই।
দুর্নীতি: void*আপনি শক্তিশালী টাইপ চেক করতে চান না ব্যবহার করবেন না । যে কোনও কিছুতে এটি রূপান্তরিত হতে পারে। বিপরীত দিকের ঠিক বিপরীত, void*নিজে ব্যতীত (এটি একটি অপ্রয়োজনীয় ব্যতিক্রম হবে যে কোনও ধরণের নিজের সাথে বেমানান ছিল)।
এছাড়াও, আফার এটি সত্যই সি থেকে আসে from