Eu uso C ++ no ESP-32. Ao registrar um timer, tenho que fazer o seguinte:
timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback);
timer_args.arg = this;
Aqui o timer chama soundCallback
.
E a mesma coisa ao registrar uma tarefa:
xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle);
Portanto, o método é iniciado em uma tarefa separada.
O GCC sempre me alerta sobre essas conversões, mas funciona da maneira planejada.
É aceitável no código de produção? Existe uma maneira melhor de fazer isso?
std::bind
Também não assume o ponteiro de objeto como primeiro argumento de método?extern "C"
aqui? A ligação C é importante neste caso?__attribute__((cdecl))
, mas não faça isso). Não é garantido que uma função C ++ tenha uma convenção de chamada compatível com C (caso contrário, no GCC, normalmente funciona bem).extern "C"
formalmente necessário, consulte[dcl.link]
"Dois tipos de funções com diferentes links de idiomas são tipos distintos, mesmo que sejam idênticos." e[expr.call]
"Chamar uma função através de uma expressão cujo tipo de função é di ff erent do tipo de função dos resultados fi nição da chamada da função no comportamento definido fi unde"Pessoalmente, a abordagem mais compatível, fácil de implementar e de entender que encontrei é apenas fornecer uma função "wrapper", compatível com a interface C esperada, que chama internamente o método (e, caso não seja estático, instanciar ou usar uma instância existente para fazer isso). Pode ser visto como uma espécie de variação do padrão de design do adaptador.
fonte
static
, vi-o como um método e, por algum motivo, não percebi que não passava othis
ponteiro como o primeiro argumento (e o debate a seguir sobre o uso dostd::bind
reforço). Mas sim, você está absolutamente certo! (Desculpem a dupla resposta!)static
tem pelo menos três significados diferentes e distintos. E você os misturará se não for cuidadoso. Eu diria que é realmente útil entender as distinções entre os diferentes usos destatic
, pois cada um deles é uma ótima ferramenta.