නරක පරිවර්තනයක් ගෙන ඒමට කිසිදු අක්ෂර වින්යාසයක් භාවිතා නොකලද, පහත දැක්වෙන ස්නිපටය වැනි කේතයන් රෝග නිර්ණයකින් තොරව සම්පාදනය කිරීමට ඉඩ සලසන ආකාරයේ පද්ධතියේ කැත කුහරය ප්රතික්ෂේප කිරීම පෙන්වීමට මම වාත්තු කරමි.
double d;
void *p = &d;
int *q = p;
එය නොපවතින බව මම ප්රාර්ථනා කරමි (එය C ++ හි නොමැත) එබැවින් මම දමමි. එය මගේ රසය සහ වැඩසටහන්කරණ දේශපාලනය නියෝජනය කරයි. මම දර්ශකයක් දැමීම පමණක් නොව, effectively ලදායි ලෙස, ඡන්ද පත්රිකාවක් දැමීම සහ මෝඩකම පිළිබඳ භූතයන් දුරු කරමි . මට ඇත්තටම මෝඩකම දුරු කරන්න බැරි නම් නම්, අවම වශයෙන් විරෝධතා දැක්වීමේ ඉරියව්වකින් එසේ කිරීමට කැමැත්ත ප්රකාශ කිරීමට මට ඉඩ දෙන්න.
ඇත්ත වශයෙන්ම, හොඳ පුරුද්දක් වන්නේ malloc
නැවත පැමිණෙන කාර්යයන් සමඟ (සහ මිතුරන්) ඔතා ගැනීම unsigned char *
සහ මූලික වශයෙන් void *
ඔබේ කේතය තුළ කිසි විටෙකත් භාවිතා නොකිරීමයි. ඔබට ඕනෑම වස්තුවකට සාමාන්ය දර්ශකයක් අවශ්ය නම්, char *
හෝ භාවිතා කරන්න unsigned char *
, සහ දෙපැත්තටම වාත්තු කරන්න. යෙදිය හැකි එක් ලිහිල් කිරීමක් නම්, සමහර විට, වාත්තු වැනි memset
හා memcpy
රහිත කාර්යයන් භාවිතා කිරීමයි .
වාත්තු යන මාතෘකාව හා C ++ ගැළපුම, එය C සහ C ++ (ඔබ කුමන අවස්ථාවකදී ලෙස ද සම්පාදනය වන ලෙස ඔබ ඔබේ කේතය ලියන්න නම් කිරීමට නැවත අගය ප්රකාශ malloc
හැර වෙනත් දෙයක් කිරීමට එය පවරා විට void *
), ඔබ ඉතා ප්රයෝජනවත් කරන්න පුළුවන් ඔබ වෙනුවෙන්ම: වාත්තු කිරීම සඳහා ඔබට මැක්රෝස් භාවිතා කළ හැකි අතර එය C ++ ලෙස සම්පාදනය කිරීමේදී C ++ විලාසිතාවන්ට පරිවර්තනය වේ, නමුත් C ලෙස සම්පාදනය කිරීමේදී C කාස්ට් දක්වා අඩු කරන්න:
/* 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
, නමුත් ක්රමලේඛය දැන් පරිවර්තනයක් සිදු වන ආකාරයට වෙනස් වුවහොත්, ඔබට රෝග විනිශ්චයක් ලැබෙනු ඇති අතර, අපේක්ෂිත පරිවර්තනය ලබා ගැනීම සඳහා ඔබට සංයෝග එකතුවක් භාවිතා කිරීමට සිදුවේ.
මෙම මැක්රෝස් පිළිපැදීමට ඔබට උපකාර කිරීම සඳහා, GNU C ++ (C නොවේ!) සම්පාදකයාට සුන්දර අංගයක් ඇත: C විලාසිතාවේ සෑම සිදුවීමක් සඳහාම නිපදවන විකල්ප රෝග විනිශ්චය.
-වෝල්ඩ්-ස්ටයිල්-කාස්ට් (සී ++ සහ පරමාර්ථ-සී ++ පමණි)
අවලංගු නොවන වර්ගයකට පැරණි ශෛලියක් (සී-ස්ටයිල්) භාවිතා කරන්නේ නම් අනතුරු අඟවන්න
C ++ වැඩසටහනක් තුළ. නව විලාසිතාවේ කාස්ට් (ගතික_ විකාශනය,
static_cast, නැවත අර්ථකථනය_ විකාශනය සහ const_cast) අඩු අවදානමක් ඇත
අනපේක්ෂිත බලපෑම් වලට සහ සෙවීමට වඩා පහසුය.
ඔබේ සී කේතය සී ++ ලෙස සම්පාදනය කරන්නේ නම්, කේතයට රිංගා ගත හැකි වාත්තු වාක්ය ඛණ්ඩයේ -Wold-style-cast
සියලු සිදුවීම් සොයා ගැනීමට ඔබට මෙම විකල්පය භාවිතා කළ හැකි (type)
අතර, ඉහත සඳහන් මැක්රෝස් අතරින් සුදුසු තේරීමක් වෙනුවට මෙම රෝග නිර්ණයන් අනුගමනය කරන්න. සංයෝජනය, අවශ්ය නම්).
පරිවර්තන සඳහා මෙම ප්රතිකාරය “පිරිසිදු සී” හි වැඩ කිරීම සඳහා ඇති විශාලතම තනි තාක්ෂණික සාධාරණීකරණයයි: ඒකාබද්ධ සී සහ සී ++ උපභාෂාව, එමඟින් ප්රතිලාභ වටිනාකම වාත්තු කිරීම තාක්ෂණිකව යුක්ති සහගත කරයි malloc
.