সি স্টাইলের কাস্ট বা সি ++ স্টাইলের কাস্ট


21

সুতরাং, আপনি কি ব্যবহার করবেন?

int anInt = (int)aFloat;

অথবা

int anInt = static_cast<int>(aFloat);
// and its brethren

এবং, আরও গুরুত্বপূর্ণ, কেন?

উত্তর:


45

প্রথমে বুঝতে হবে যে সেই লাইনগুলি সমতুল্য নয়

int* anInt = (int*)aFloat; // is equivalent to

int* anInt = reinterpret_cast<int*>(aFloat); 

এখানে যা ঘটছে তা হ'ল প্রোগ্রামার সংকলকটিকে কাস্ট তৈরি করতে যা করতে পারে তার জন্য বলছে।

পার্থক্যটি গুরুত্বপূর্ণ কারণ স্ট্যাটিক_কাস্ট ব্যবহার করে রূপান্তর করতে কেবল "সুরক্ষিত" বেস টাইপের জন্য জিজ্ঞাসা করা হবে, যেখানে পুনরায় সংজ্ঞা_কাস্ট কোনও ক্ষেত্রে রূপান্তর করবে, সম্ভবত কেবলমাত্র প্রদত্ত বস্তুর মেমরির উপরে ওয়ান্টেড মেমরির বিন্যাসটি ম্যাপিংয়ের মাধ্যমে।

সুতরাং, যেমন "ফিল্টার" একরকম নয়, নির্দিষ্ট কাস্ট ব্যবহার করা সি কাস্ট ব্যবহারের চেয়ে আরও স্পষ্ট এবং নিরাপদ, আপনি কোথায় ভুল করেছেন তা জানাতে আপনি যদি সংকলকটিতে (বা রানটাইম ইম্পেল ব্যবহার করেন। , সি কাস্ট এবং এন্টিরিটরিপেক্ট_কাস্ট এড়ানো।

এখন এটি আরও স্পষ্ট হয়ে ওঠার পরে, অন্য একটি জিনিস রয়েছে: স্ট্যাটিক_কাস্ট, পুনরায় ব্যাখ্যা_কাস্ট, কনস্ট_কাস্ট এবং ডায়নামিক_কাস্ট সন্ধান করা আরও সহজ

এবং চূড়ান্ত বিষয়: তারা কুরুচিপূর্ণ । এটা চেয়েছিল। সম্ভাব্য বগী কোড, কোড গন্ধ, স্পষ্টত "কৌশল" যা বাগ তৈরি করতে পারে, ট্র্যাফিক করা সহজ হয় যখন এটি কুরুচিপূর্ণ বর্ণের সাথে সম্পর্কিত। খারাপ কোডটি কুৎসিত হওয়া উচিত

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

নতুন স্টাইলের কাস্ট প্রবর্তন করার গৌণ কারণ হ'ল কোনও প্রোগ্রামে সি-স্টাইলের ক্যাসেটগুলি খুব শক্ত hard উদাহরণস্বরূপ, আপনি সাধারণ সম্পাদক বা ওয়ার্ড প্রসেসর ব্যবহার করে কাস্টগুলি সহজেই অনুসন্ধান করতে পারবেন না। সি-স্টাইলের বর্ণের এই অদৃশ্যতা বিশেষত দুর্ভাগ্যজনক কারণ এগুলি সম্ভবত সম্ভাব্য ক্ষতিকারক। একটি কুরুচিপূর্ণ অপারেশনের একটি কুৎসিত সিনট্যাকটিক ফর্ম থাকা উচিত। নতুন পর্যায়ের জাতির জন্য সিনট্যাক্স বেছে নেওয়ার কারণ হিসাবে এই পর্যবেক্ষণটি ছিল। আরও কারণ হ'ল নতুন ধাঁচের ক্যাসেটগুলির জন্য টেমপ্লেট স্বরলিপিটি মেলানো ছিল, যাতে প্রোগ্রামাররা তাদের নিজস্ব ক্যাসট লিখতে পারে, বিশেষত রান-টাইম পরীক্ষিত কাস্টগুলি।

সম্ভবত, কারণ স্ট্যাটিক_কাস্ট এতটাই কুৎসিত এবং টাইপ করা তুলনামূলকভাবে শক্ত তাই আপনি ব্যবহারের আগে দু'বার ভাবার সম্ভাবনা বেশি? এটি ভাল হবে, কারণ আধুনিক সি ++ তে ক্যাসটগুলি বেশিরভাগ ক্ষেত্রেই এড়ানো যায়।

উত্স: বাজর্ন স্ট্রস্ট্রপ (সি ++ স্রষ্টা)


2
আমার আরও কয়েকটি পয়েন্ট থাকলে আমি এটিকে কমিয়ে দেবো, তবে দুর্ভাগ্যক্রমে আমি পারছি না। সি-স্টাইলের কাস্টগুলি পুনরায় ব্যাখ্যা_কাস্টের সমতুল্য নয়। বিবেচনা করুন reinterpret_cast<int>(double);। সি-স্টাইলের কাস্টের সাহায্যে কোনও ডাব্লু ইন্টিতে ডাবল করা পুরোপুরি সম্ভব, তবে পুনরায় ব্যাখ্যা_কাস্ট দিয়ে এটি করা সম্ভব নয়। আমি দেখতে পাচ্ছি টিম্বো ইতিমধ্যে এটি আপনাকে দেখিয়েছে, এবং আপনি বলেছিলেন যে আপনি এটি ঠিক করে দেবেন, কিন্তু চার বছর পরে এটি ভুল রয়েছে। কাস্ট ব্যবহারের প্রয়োজনের যথাযথ বৈধ কারণ রয়েছে বলে যদি এটি ঠিক করা হয় তবে আমি আপনাকে নীচে নামিয়ে দেব। : এখানে একটি ভাল উত্তর এর stackoverflow.com/a/332086/3878168
Yay295

36

সি ++ কাস্টগুলি আরও সীমাবদ্ধ (সুতরাং আপনার উদ্দেশ্যকে আরও ভালভাবে প্রকাশ করুন এবং কোড পর্যালোচনা আরও সহজ করুন ইত্যাদি)। আপনার যদি প্রয়োজন হয় তবে সেগুলি অনুসন্ধান করাও অনেক সহজ।


10
... এবং তারা আপনার ইচ্ছা অনুযায়ী করার সম্ভাবনা বেশি। ;-)
মক্ক

7
এবং এগুলি টাইপ করার জন্য আরও অনেক বেশি, আপনাকে কেবল জাতগুলি প্রয়োজন ছাড়াই আপনার প্রকারগুলি সঠিক করার আরও একটি কারণ দেয়।
মাইকেল কোহনে

7
এবং এগুলি একটি বৈশিষ্ট্য হিসাবে কুৎসিত, স্পষ্ট করে তোলে যেখানে কোডটিতে উন্নতির পয়েন্ট বা বিশেষ ক্ষেত্রে ডকুমেন্টেশন প্রয়োজন হতে পারে obvious - সম্পাদনা করুন: বাহ আমি সন্ধান পেয়েছি আমি এই প্রশ্নেরও উত্তর দিয়েছি! এক্সডি
ক্লাইম

এখন কেন আমি তাদের অনুসন্ধান করতে চাই?
উত্সাহককে

@ ডিডুকিপেটর কোড-বেসে ক্যাসেটগুলি কোথায় ঘটছে তা জানতে আপনি অনেকগুলি কারণ জানতে চাইতে পারেন। উদাহরণস্বরূপ, যখন বাগগুলি শিকার করার সাথে জড়িত হতে পারে (বিশেষত ক্রস-প্ল্যাটফর্ম ডেভেলপমেন্ট করার সময়) hunting
ক্লাইম

13

বিকল্প সি: একটি "সি ++ - শৈলী" castালাই, কারণ এটি কোনও নির্মাণের থেকে পৃথক নয়:

int anInt = int(aFloat);

অথবা এমনকি:

int anInt(aFloat);

এটিকে বাদ দিয়ে আদিমদের সাথে এই তুচ্ছ ঘটনাগুলি বাদে, যা ভালভাবে বোঝা যায়, আমি সি-স্টাইলের বর্ণের চেয়ে x_cast <> s ব্যবহার করতে পছন্দ করি। তিনটি কারণ রয়েছে:

  • প্রোগ্রামারটি সঞ্চালনের চেষ্টা করছে এমন অপারেশনটিকে তারা সংকীর্ণভাবে সংজ্ঞায়িত করে।

  • তারা সি-স্টাইলের কাস্টগুলি না করতে পারে এমন ক্রিয়া সম্পাদন করতে পারে (বিশেষত ডায়নামিক_কাস্ট <> এর ক্ষেত্রে, যা একাধিক-উত্তরাধিকার শৃঙ্খলের শাখাগুলিতে ক্রস কাস্ট করতে পারে)।

  • তারা কুরুচিপূর্ণ । তারা উচ্চস্বরে ঘোষণা করে যে প্রোগ্রামার টাইপ সিস্টেমের বিরুদ্ধে কাজ করছে। এই ক্ষেত্রে, এটি একটি ভাল জিনিস।


7

সি তে কোড লেখার ক্ষেত্রে সি কাস্ট ব্যবহার করুন। সি ++ এ লেখার ক্ষেত্রে একটি সি ++ castালাই ব্যবহার করুন।

সর্বাধিক ingালাই সঠিক প্রকারের সুরক্ষা ভেঙে দেয়, তবে সি ++ আরও সীমাবদ্ধ এবং তাই আপনি কোনও সি কাস্টের চেয়ে কম টাইপ-অনিরাপদ।

অতিরিক্ত চাপ প্রয়োগ করার জন্য যদিও আমি (টি *) নুল ব্যবহার করে কাউকে সহ্য করতে পারি ...


7

সি / সি ++ সম্পর্কে আমার কয়েকটি বিধি রয়েছে - স্টাইলের কাস্ট:

  1. একটি কনস্টিকে ডিস-প্রয়োগ করতে অবশ্যই সর্বদা একটি ব্যবহার করা উচিত const_cast। সুস্পষ্ট কারণে দুঃখের বিষয়, একটি কনস্টেন্টটি প্রয়োগ না করার বিষয়ে আমার নিয়মটি কীবোর্ডের কাছে পৌঁছানোর এবং প্রোগ্রামারের আঙুলটি ভেঙে ফেলার কারণে অনুমোদিত হয়নি।
  2. প্রোগ্রামাররা ধাতুতে নামার সময় যে বিট-ম্যানিপুলেশন-স্টাইলের শেনিনিগানগুলি ব্যবহার করা উচিত সেগুলি ব্যবহার করা উচিত reinterpret_cast। এটি আসলে এমন ধরণের castালাই যা সিতে নেই: ভান করুন এই পূর্ণসংখ্যার বিটগুলি আসলে একটি ফ্লোটের বিট। এটি অপ্রীতিকরতা এড়ানো (int)(*(int*)(&floatVar))
  3. যদি আপনি " dynamic_cast" শব্দটি টাইপ করেন তবে থামুন এবং আপনার পলিমারফিক ক্লাসের স্তরক্রম এবং নকশাটি পুনরায় মূল্যায়ন করুন। যতক্ষণ না আপনি এই শব্দগুলিকে মুছতে না পারেন ততক্ষণ আপনার শ্রেণিবৃত্তির নকশার পুনরায় মূল্যায়ন চালিয়ে যান Continue
  4. বিরক্ত করবেন না static_cast

# 4 এর পিছনে যুক্তিটি কেবল এটির কোনও ব্যাপার নয়। যে পরিস্থিতি অন্যান্য নিয়মের সাথে খাপ খায় না সেগুলি হয় সুস্পষ্ট বা সত্যই নিম্ন-স্তরের। ইন্ট-টু-ফ্লোটের মতো সাধারণ ধরণের একটি সু-বোঝা রূপান্তরটির জন্য বিশেষ সিনট্যাক্সের প্রয়োজন হবে না। এবং যদি আপনি কোনও কিছুর গভীর, কুৎসিত সাহসিকতার নীচে থাকেন তবে ভাল, আপনি কোনও কিছুর গভীর, কুৎসিত সাহসের নিচে রয়েছেন। দাঁত, নখ এবং আগুন যেহেতু ইতিমধ্যে ইতিমধ্যে তা দিয়েছে তাই "এখানে ড্রাগন থাকতে হবে" এদিকে দৃষ্টি আকর্ষণ করার দরকার নেই।


1
dynamic_castএকটি সম্পূর্ণ বৈধ সরঞ্জাম। কদাচিৎ দরকারী, আমি স্বীকার করব, তবে এটি বৈশ্বিক পরিবর্তনশীলগুলির মতো জিনিসগুলির শয়তান থেকে অনেক দূরে। তবে, প্রাথমিকভাবে, আমি আপনাকে হ্রাস করেছি কারণ আপনি যে প্রশ্নের উত্তর দেননি , যা সি-স্টাইলের বর্ণের ব্যবহার সম্পর্কে নয়।
ডেডএমজি

2
@ ডেড এমএমজি: আমি সি-স্টাইলের জাতগুলি সম্পর্কে কথা বলেছি। সম্পূর্ণ শেষ অনুচ্ছেদটি স্টিকিক_কাস্টের পক্ষে সি-স্টাইলের কাস্টকে ন্যায়সঙ্গত করে।
নিকল বোলাস

"দুঃখের বিষয়, প্রোগ্রামটির আঙুলটি কীবোর্ডের কাছে পৌঁছানোর এবং ভেঙে ফেলার কারণে কনটটি প্রয়োগের বিষয়ে আমার নিয়ম অনুমোদিত হয়নি।" টেকনিক্যালি এটি সংঘটিত করার জন্য এটি আসলে আইনী। সংকলকটির পক্ষে আপনার নাক থেকে অসুরদের উড়ে ফেলা বৈধ ।
ফারাপ

4

উপরের পোস্টগুলি নোট হিসাবে C ++ (স্ট্যাটিক) castালাই অনুশীলনে কিছুটা নিরাপদ।

বিভিন্ন ধরণের কাস্টিং এবং তাদের পক্ষের পক্ষে এবং কনস সম্পর্কে আরও কিছু তথ্য সন্ধান করা স্মার্ট হতে পারে।

শুধু এর কারণেই আরও একটি পটভূমি রয়েছে। ।

http://en.wikipedia.org/wiki/Static_cast

http://en.wikipedia.org/wiki/Dynamic_cast

http://en.wikipedia.org/wiki/Reinterpret_cast


3

এটি আসলে কোন ভাষার সাথে আমি কাজ করছি তার উপর নির্ভর করে যেহেতু আপনি জানেন তারা কী বলে: রোমে রোমান কথা বলতে। সুতরাং আমি যদি সি তে প্রোগ্রামিং করছি তবে আমি সি বৈশিষ্ট্যগুলি সর্বাধিক ব্যবহার করার চেষ্টা করি, তবে আমি যদি সি ++ তে প্রোগ্রামিং করি তবে আমি এগিয়ে যাই এবং সর্বাধিকতে সি ++ বৈশিষ্ট্যগুলি ব্যবহার করি, যদিও কিছু লোক সেই পদ্ধতির পছন্দ না করে কারণ তারা বলে যে এটি কোডটি "কম পোর্টেবল" করে তোলে, আমি বলি যে আমি পাত্তা দিই না, আমি সি ++ এবং সি ++ তে প্রোগ্রামিং করি এবং কোড সংকলনের জন্য আমার পুরো সি ++ সামঞ্জস্যপূর্ণ সংকলক প্রয়োজন, অন্যথায় আমি অন্য কিছু দিয়ে কাজ করব প্রথম অবস্থানে.


এটি সি ++ - সি ;-) শৈলীর
ক্যাসেটগুলি

3

টেমপ্লেট ব্যবহার করার সময় সি স্টাইলের ক্যাসেটগুলির সাথে সমস্যার কারণে স্ট্যাটিক_কাস্ট ইত্যাদি আবিষ্কার করা হয়েছিল। আপনি যদি কোনও টেম্পলেট লিখছেন, বা যদি আপনার কোড পরে কোনও টেম্পলেটে রূপান্তরিত হতে পারে তবে সি ++ - স্টাইলের ক্যাসেটগুলি ব্যবহার করা ভাল ধারণা। কারণটি হ'ল সি ++ - শৈলীটি আরও ভাল অভিপ্রায় পোষ্ট করে, তাই সি-স্টাইলের কাস্টগুলি ভুল কাজ করবে এমন ক্ষেত্রে প্রত্যাশিত ফলাফল দেবে (নির্দিষ্ট ধরণের টেম্পলেট প্যারামিটার হিসাবে দেওয়া হয়)।

এগুলি ছাড়াও, আমি বলি সি ++ - স্টাইলের কাস্টগুলি ব্যবহার করুন যদি আপনার কোনও নির্দিষ্ট সমস্যা থাকে যা তাদের প্রয়োজন হয় - ডাইনামিক_কাস্ট সর্বাধিক সাধারণ তবে এটি সম্ভবত প্রতিদিনের জিনিস নয়।

আর কিছু, এবং একটি সি স্টাইলের কাস্ট কিছুটা কম বিশৃঙ্খলা এবং পাঠযোগ্যতার সহায়তা হতে পারে বা আজকাল সেই কাস্ট স্টাইলের সাথে পাঠক কতটা পরিচিত তার উপর নির্ভর করে না। এটি আমার দৃষ্টিতে সত্যই গুরুত্বপূর্ণ নয়, বেশিরভাগই ব্যক্তিগত পছন্দের জিনিস, যদিও কিছু লোক সি স্টাইল পছন্দ না করে তবে অবাক হবেন না।

চূড়ান্ত দ্রষ্টব্য - আপনার যদি এতগুলি কাস্টের প্রয়োজন হয় যে এটি একটি বড় বিষয়, আপনি সম্ভবত অন্য কোনও ভুল করছেন। কিছু ক্ষেত্রে এর ব্যতিক্রম রয়েছে, তবে বেশিরভাগ উচ্চ স্তরের কোডের জন্য অনেকগুলি (যদি থাকে) কাস্টের প্রয়োজন হবে না।

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