Этот код встречается в CrossExample от superpowered.com:
static void playerEventCallbackA(void *clientData, SuperpoweredAdvancedAudioPlayerEvent event, void * __unused value) {
if (event == SuperpoweredAdvancedAudioPlayerEvent_LoadSuccess) {
SuperpoweredAdvancedAudioPlayer *playerA = *((SuperpoweredAdvancedAudioPlayer **)clientData);
playerA->setBpm(126.0f);
playerA->setFirstBeatMs(353);
playerA->setPosition(playerA->firstBeatMs, false, false);
};
}
playerA = new SuperpoweredAdvancedAudioPlayer(&playerA , playerEventCallbackA, samplerate, 0);
playerA->open(path, fileAoffset, fileAlength);
Может ли кто-нибудь помочь мне понять первую строку внутри if
заявление? В частности, как мне интерпретировать правую часть задания?
*((SuperpoweredAdvancedAudioPlayer **)clientData)
clientData
передается как void pointer
, Позже, это приведено к pointer to pointer
типа SuperpoweredAdvancedAudioPlayer
, Я полагаю, что clientData
был такого типа, прежде чем передать его в функцию, поэтому необходимо приведение. Я не знаю почему это void*
используется вместо SuperpoweredAdvancedAudioPlayer**
, Не хорошо, но не редко.
Вар по имени playerA
указатель на объект типа SuperpoweredAdvancedAudioPlayer
, Разыменовав указатель на указатель, вы получите указатель на SuperpoweredAdvancedAudioPlayer
объект того же типа, что и playerA
,
Обратите внимание, что playerA
объявляется только внутри блока if, его жизнь заканчивается там. Есть другой playerA
вне блока, который должен быть объявлен перед назначением его чему-либо.
Других решений пока нет …