Не в состоянии модернизировать эти слепки в стиле C

#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 — «разбить» ** указатель надвое, но я думаю, что это также делает код немного более лаконичным. Очевидно, что вы можете назвать его так, как хотите.