আমি টাইপ সিস্টেমে কুরুচিপূর্ণ গর্তের অস্বীকৃতি প্রদর্শন করার জন্য কেবল কাস্টে রেখেছিলাম, যা নীচের স্নিপেটের মতো কোডগুলি ডায়াগনস্টিকস ছাড়াই সংকলন করতে দেয়, যদিও কোনও রূপান্তর খারাপ রূপান্তর আনতে ব্যবহৃত হয় না:
double d;
void *p = &d;
int *q = p;
আমি চাই যে এটি বিদ্যমান না (এবং এটি সি ++ তে নেই) এবং তাই আমি কাস্ট করেছি। এটি আমার স্বাদ এবং আমার প্রোগ্রামিং রাজনীতির প্রতিনিধিত্ব করে। আমি কেবল একটি পয়েন্টার castালাই করছি না, কার্যকরভাবে, একটি ব্যালট ingালাই করছি, এবং বোকামির ভূতদের বের করে দিচ্ছি । যদি আমি আসলে বোকামি ফেলে দিতে না পারি তবে কমপক্ষে আমাকে প্রতিবাদের ইঙ্গিত দিয়ে এমন করার ইচ্ছা প্রকাশ করতে দিন।
প্রকৃতপক্ষে, একটি ভাল অনুশীলন হ'ল malloc
ফাংশনগুলি (এবং বন্ধুরা) ফিরে আসে unsigned char *
এবং মূলত void *
আপনার কোডটিতে কখনও ব্যবহার না করা । আপনার যদি জেনেরিক পয়েন্টার-থেকে-যেকোন-অবজেক্টের প্রয়োজন হয় তবে একটি char *
বা ব্যবহার করুন unsigned char *
এবং উভয় দিকেই ক্যাসেট রয়েছে। যে এক শিথিলতায় লিপ্ত হতে পারে, তা হ'ল কাস্টের মতো memset
এবং memcpy
ব্যতীত ফাংশন ব্যবহার করা ।
Ingালাই এবং সি ++ সামঞ্জস্যের বিষয়ে, আপনি যদি আপনার কোডটি লিখেন যাতে এটি সি এবং সি ++ উভয় হিসাবে সংকলিত হয় (এই ক্ষেত্রে আপনাকে যদিmalloc
অন্য কোনও কিছুতে নির্ধারিত করার সময় ফেরতের মান দিতে হয় void *
) তবে আপনি খুব সহায়ক হতে পারেন নিজের জন্য জিনিস: আপনি কাস্টিংয়ের জন্য ম্যাক্রোগুলি ব্যবহার করতে পারেন যা সি ++ হিসাবে সংকলন করার সময় সি ++ স্টাইলের কাস্টগুলিতে অনুবাদ করে তবে সি হিসাবে সংকলন করার সময় কোনও সি কাস্টে হ্রাস করুন:
/* In a header somewhere */
#ifdef __cplusplus
#define strip_qual(TYPE, EXPR) (const_cast<TYPE>(EXPR))
#define convert(TYPE, EXPR) (static_cast<TYPE>(EXPR))
#define coerce(TYPE, EXPR) (reinterpret_cast<TYPE>(EXPR))
#else
#define strip_qual(TYPE, EXPR) ((TYPE) (EXPR))
#define convert(TYPE, EXPR) ((TYPE) (EXPR))
#define coerce(TYPE, EXPR) ((TYPE) (EXPR))
#endif
যদি আপনি এই ম্যাক্রোগুলি মেনে চলেন, তবে grep
এই শনাক্তকারীদের জন্য আপনার কোড বেসের একটি সন্ধানের সাহায্যে আপনাকে দেখানো হবে যে আপনার সমস্ত ক্যাসেট কোথায় রয়েছে, তাই আপনি সেগুলির কোনওটি ভুল কিনা তা আপনি পর্যালোচনা করতে পারেন।
তারপরে, এগিয়ে যাওয়া, আপনি যদি নিয়মিত কোডটি সি ++ দিয়ে সংকলন করেন তবে এটি একটি উপযুক্ত কাস্টের ব্যবহার কার্যকর করবে। উদাহরণস্বরূপ, আপনি যদি strip_qual
কেবল কোনও const
বা মুছে ফেলার জন্য ব্যবহার করেন volatile
তবে প্রোগ্রামটি এমনভাবে পরিবর্তিত হয় যে কোনও ধরণের রূপান্তর এখন জড়িত রয়েছে, আপনি একটি ডায়াগোনস্টিক পাবেন এবং কাঙ্ক্ষিত রূপান্তর পেতে আপনাকে ذاتগুলির সংমিশ্রণটি ব্যবহার করতে হবে।
আপনাকে এই ম্যাক্রোগুলিকে মেনে চলতে সহায়তা করার জন্য, জিএনইউ সি ++ (সি নয়!) সংকলকটির একটি সুন্দর বৈশিষ্ট্য রয়েছে: একটি alচ্ছিক ডায়াগনস্টিক যা সি স্টাইলের বর্ণের সমস্ত ঘটনার জন্য উত্পাদিত হয়।
-ভোল্ড-স্টাইল-কাস্ট (কেবলমাত্র C ++ এবং উদ্দেশ্য-সি ++)
যদি একটি পুরানো শৈলী (সি-স্টাইল) একটি অ-শূন্য প্রকারের কাস্ট ব্যবহার করা হয় তবে সতর্ক করুন
একটি সি ++ প্রোগ্রামের মধ্যে। নতুন স্টাইলের কাস্ট (ডায়নামিক_কাস্ট,
স্ট্যাটিক_কাস্ট, পুনরায় ব্যাখ্যা_কাস্ট এবং কনস্ট_কাস্ট) কম দুর্বল
অনিচ্ছাকৃত প্রভাব এবং অনুসন্ধান করা অনেক সহজ to
যদি আপনার সি কোডটি সি ++ হিসাবে সংকলন করে, আপনি কোডটিতে ক্রাইপ হতে পারে -Wold-style-cast
এমন (type)
কাস্টিং সিনট্যাক্সের সমস্ত উপস্থিতিগুলি খুঁজে পেতে এই বিকল্পটি ব্যবহার করতে পারেন এবং উপরের ম্যাক্রোগুলির (বা একটি থেকে উপযুক্ত পছন্দ হিসাবে এটি প্রতিস্থাপন করে এই ডায়াগনস্টিকগুলি অনুসরণ করতে পারেন) can সংমিশ্রণ, যদি প্রয়োজন হয়)।
রূপান্তরগুলির এই চিকিত্সা একটি "ক্লিন সি" তে কাজ করার একক বৃহত্তম প্রযুক্তিগত যৌক্তিকতা: সম্মিলিত সি এবং সি ++ উপভাষা, যা পরিবর্তিতভাবে এর ফেরতের মান কাস্টিংকে বৈধতা দেয় malloc
।