#visual-c #casting
Вопрос:
Код:
int CChristianLifeMinistryEditorDlg::CompareDate(const void* pArg1, const void* pArg2) { const STUDENT_ASSIGN_HIST_S* psAssign1 = *((STUDENT_ASSIGN_HIST_S * *)pArg1); const STUDENT_ASSIGN_HIST_S* psAssign2 = *((STUDENT_ASSIGN_HIST_S * *)pArg2); int iGreater = 0; // assume they are the same if (psAssign1-gt;datMeeting lt; psAssign2-gt;datMeeting) iGreater = -1; else if (psAssign1-gt;datMeeting gt; psAssign2-gt;datMeeting) iGreater = 1; return iGreater; }
Я изо всех сил пытаюсь понять, как модернизировать слепки в стиле C:
const STUDENT_ASSIGN_HIST_S* psAssign1 = *((STUDENT_ASSIGN_HIST_S * *)pArg1); const STUDENT_ASSIGN_HIST_S* psAssign2 = *((STUDENT_ASSIGN_HIST_S * *)pArg2);
Я пытался:
const STUDENT_ASSIGN_HIST_S* psAssign1 = *(static_castlt;STUDENT_ASSIGN_HIST_S * *gt;(pArg1)); const STUDENT_ASSIGN_HIST_S* psAssign1 = *(reinterpret_castlt;STUDENT_ASSIGN_HIST_S * *gt;(pArg1));
И в обоих случаях VS сказал мне, что это неверный бросок.
Ответ №1:
Вы можете попробовать это:
typedef const STUDENT_ASSIGN_HIST_S* PCSAHS; //... PCSAHS psAssign1 = *(static_castlt;const PCSAHS*gt;(pArg1));
pArg1
имеет const
квалификатор, поэтому его необходимо сохранить при кастинге.
Комментарии:
1. Похоже, это работает нормально — спасибо! Я добавил
typedef
внутреннюю часть самой функции. Я полагаю, это было нормально? Я не получал никаких предупреждений.2. Так
PCSAHS*
становитсяSTUDENT_ASSIGN_HIST_S**
, как в оригинальном актерском составе вместе соconst
своим .3. @AndrewTruckle, это верно. Основная причина использования
typedef
— «разбить»**
указатель надвое, но я думаю, что это также делает код немного более лаконичным. Очевидно, что вы можете назвать его так, как хотите.