যাই হোক না কেন শূন্য * কাস্ট করার সময় আমার কি স্ট্যাটিক_কাস্ট বা পুনরায় ব্যাখ্যা_কাস্ট ব্যবহার করা উচিত?


202

স্ট্যাটিক_কাস্ট এবং পুনরায় ব্যাখ্যা_কাস্ট উভয়ই অন্য পয়েন্টার টাইপের শূন্য * castালাইয়ের জন্য দুর্দান্ত কাজ করছে বলে মনে হচ্ছে। একে অপরের প্রতি পক্ষপাতিত্ব করার কোনও উপযুক্ত কারণ আছে কি?


78
@ অ্যানন দৃশ্যত আপনি এর আগে পসিক্স থ্রেডের সাথে কখনও কাজ করেন নি।
user470379

7
@ user470379 বাহ ... এই কারণেই আমি এই প্রশ্নে এস ও তে অবতরণ করেছি! দুর্দান্ত পর্যবেক্ষণ :-)।
ওগ্রে গীতসংস্থান 33

উত্তর:


148

ব্যবহার করুনstatic_cast : এটি সংকীর্ণ নিক্ষিপ্ত যা এখানে রূপান্তরটি কী হবে তা হুবহু বর্ণনা করে।

একটি ভুল ধারণা রয়েছে যে ব্যবহার reinterpret_castকরা আরও ভাল মিল হবে কারণ এর অর্থ "সম্পূর্ণরূপে সুরক্ষা উপেক্ষা করুন এবং কেবল এ থেকে বি তে নিক্ষিপ্ত"।

তবে এটি আসলে ক এর প্রভাব বর্ণনা করে না reinterpret_cast। পরিবর্তে, reinterpret_castএর বেশ কয়েকটি অর্থ রয়েছে, যার সবক'টিই বলে যে "দ্বারা সম্পাদিত ম্যাপিংটি reinterpret_castবাস্তবায়ন-সংজ্ঞায়িত।" [5.2.10.3]

কিন্তু থেকে কাস্ট নির্দিষ্ট ক্ষেত্রে void*করতে T*ম্যাপিং সম্পূর্ণরূপে মান দ্বারা উত্তমরুপে সংজ্ঞায়িত হয়; যথা, এর ঠিকানা পরিবর্তন না করেই টাইপলেস পয়েন্টারে কোনও টাইপ বরাদ্দ করা।

এই পছন্দ একটি কারণ static_cast

অতিরিক্তভাবে এবং তাত্ক্ষণিকভাবে আরও গুরুত্বপূর্ণ, এটি হ'ল প্রতিটি ব্যবহার নিখুঁতভাবে reinterpret_castবিপজ্জনক কারণ এটি অন্য যে কোনও কিছুকে সত্যই (পয়েন্টারগুলির জন্য) রূপান্তরিত করে, যদিও static_castএটি আরও বেশি সীমাবদ্ধ, সুতরাং এটি আরও ভাল স্তরের সুরক্ষা সরবরাহ করে। এটি ইতিমধ্যে আমাকে ত্রুটি থেকে বাঁচিয়েছে যেখানে আমি ঘটনাক্রমে এক পয়েন্টার টাইপের অন্যটিতে চাপ দেওয়ার চেষ্টা করেছি।


8

এটি একটি কঠিন প্রশ্ন। এক দিকে, কনরাড জন্য বৈশিষ্ট সংজ্ঞা সম্পর্কে একটি চমৎকার বিন্দু করে তোলে reinterpret_cast যদিও বাস্তবে এটা সম্ভবত একই জিনিস আছে। অন্যদিকে, আপনি যদি পয়েন্টার প্রকারের মধ্যে কাস্টিং করছেন (উদাহরণস্বরূপ কোনও চর * এর মাধ্যমে মেমরিতে সূচি দেওয়ার সময় এটি সাধারণভাবে), স্ট্যাটিক_কাস্ট একটি সংকলক ত্রুটি তৈরি করবে এবং আপনাকে যেভাবেই পুনরায় সংজ্ঞা_কাস্ট ব্যবহার করতে বাধ্য করা হবে ।

অনুশীলনে আমি পুনরায় সংজ্ঞা_কাস্ট ব্যবহার করি কারণ এটি castালাই ক্রিয়াকলাপের উদ্দেশ্য সম্পর্কে আরও বর্ণনামূলক। আপনি অবশ্যই ভিন্ন ভিন্ন অপারেটরের জন্য কেবলমাত্র পয়েন্টার পুনরায় ব্যাখ্যা করতে (যা একই ঠিকানাটি ফেরত দেওয়ার গ্যারান্টিযুক্ত) মনোনীত করার জন্য একটি কেস তৈরি করতে পারেন, তবে স্ট্যান্ডার্ডের মধ্যে একটি নেই।


6
" পয়েন্টার পুনরায় সংজ্ঞা দেওয়ার জন্য আলাদা আলাদা অপারেটর (কেবল একই ঠিকানা ফেরতের গ্যারান্টি দিয়েছিল) " আলিঙ্গন? যে অপারেটর হয় reinterpret_cast !
কৌতূহলী

2
@ কুরিয়াসগ্যুই মান অনুযায়ী সত্য নয়। পুনরায় ব্যাখ্যা_কাস্ট গ্যারান্টি দেয় না যে একই ঠিকানা ব্যবহার করা হয়েছে। কেবলমাত্র যদি আপনি পুনরায় ব্যাখ্যা_কাস্ট এক প্রকার থেকে অন্য প্রকারে এবং তারপরে আবার ফিরে আসে তবে আপনি যে ঠিকানাটি দিয়ে শুরু করেছিলেন সেটি আবার ফিরে পাবেন।
ক্লাইডেঘস্ট

0

আমি সর্বদা দুর্বলতম সম্ভাব্য castালাই ব্যবহার করার পরামর্শ দিই।

reinterpret_castএকটিতে পয়েন্টার castালতে ব্যবহৃত হতে পারে float। Structureালাই যত বেশি কাঠামো ভাঙবে তত বেশি মনোযোগ ব্যবহারের প্রয়োজন।

এর ক্ষেত্রে char*, আমি সি-স্টাইলের castালাই ব্যবহার করব, যতক্ষণ না আমাদের কিছু থাকে reinterpret_pointer_cast, কারণ এটি দুর্বল এবং অন্য কিছুই যথেষ্ট নয়।


2
"পুনরায় ব্যাখ্যা_কাস্টটি একটি ফ্লোটে পয়েন্টার castালতে ব্যবহৃত হতে পারে " "অবশ্যই না!
কৌতূহলী

3
সম্ভবতfloat f = *reinterpret_cast<const float*>(&p);
বেন ভয়েগট

2
@ বেনভয়েগ্ট যা পয়েন্টারগুলির মধ্যে নিক্ষেপ করছে; তাদের মধ্যে একটি ভাসমান পয়েন্টার হতে পারে।
নোদকাই

5
"বেনভয়েগট" সম্পূর্ণ অভিব্যক্তি "যদিও কাস্ট নয়। অভিব্যক্তিটি একটি কাস্টের জন্য প্রয়োগ করা একটি বিন্যাস নিয়ে গঠিত। আপনি দাবি করেছেন যে এটিতে একটি পয়েন্টার কাস্ট করা সম্ভব ছিল float, যা মিথ্যা। এক্সপ্রেশনটি কাস্ট void **করে const float *, এবং তারপরে রূপান্তর const float *করতে একটি ডেরিফারেন্স অপারেশন (যা কোনও কাস্ট নয়) ব্যবহার করে float
এমএম

2
@ বেনওয়েগ্ট আপনি "আমি কীভাবে কাস্ট করব ..." এমন প্রশ্নের জবাবে আপনি সেই কোডটি দিয়েছিলেন এবং তারপরে কেউ যখন বলেছিল যে কোডটি পয়েন্টারের মধ্যে ফেলেছে (যা এটি করে) তখন আপনি "না" বলেছিলেন
এমএম

-7

আমার ব্যক্তিগত পছন্দটি এইরকম কোড সাক্ষরতার উপর ভিত্তি করে:

void* data = something;
MyClass* foo = reinterpret_cast<MyClass*>(data);
foo->bar();

অথবা

typedef void* hMyClass; //typedef as a handle or reference
hMyClass = something;
const MyClass& foo = static_cast<MyClass&>(*hMyClass);
foo.bar();

তারা উভয়ই শেষ পর্যন্ত একই কাজ করে, তবে স্ট্যাটিক_কাস্টটি মাঝারি ওয়্যারটিতে আরও উপযুক্ত বলে মনে হয়, অ্যাপ্লিকেশনটি পরিবেশিত, আবার পুনরায় ব্যাখ্যা কাস্ট এমন কিছু মনে হয় যা আপনি নিম্ন স্তরের লাইব্রেরি আইএমএইচওতে দেখতে চান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.