1

此代码出现在superpowered.com的CrossExample中:

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)

4

1 回答 1

2

clientData作为一个传递void pointer。后来,它被强制转换pointer to pointer为 type SuperpoweredAdvancedAudioPlayer。我想clientData在将它传递给函数之前就是那种类型,这就是需要强制转换的原因。我不知道为什么void*使用它而不是SuperpoweredAdvancedAudioPlayer**. 不好,但并不罕见。

一个名为的 varplayerA是一个指向类型对象的指针SuperpoweredAdvancedAudioPlayer。取消引用指向指针的指针,您将获得指向SuperpoweredAdvancedAudioPlayer对象的指针,与playerA.

请注意,playerA仅在 if 块内声明,它的生命在那里结束。块外还有另一个playerA,必须在将其分配给任何东西之前声明。

于 2016-12-16T01:43:31.683 回答