J'utilise C ++ sur ESP-32. Lors de l'enregistrement d'une minuterie, je dois faire ceci:
timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback);
timer_args.arg = this;
Ici, la minuterie appelle soundCallback
.
Et la même chose lors de l'enregistrement d'une tâche:
xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle);
La méthode est donc démarrée dans une tâche séparée.
GCC m'avertit toujours de ces conversions, mais cela fonctionne comme prévu.
Est-ce acceptable dans le code de production? Y a-t-il une meilleure manière de faire cela?
std::bind
N'assume pas également le pointeur d'objet comme premier argument de méthode?extern "C"
ici? La liaison C est-elle importante dans ce cas?__attribute__((cdecl))
, mais veuillez ne pas le faire). Sinon, une fonction C ++ n'est pas garantie d'avoir une convention d'appel compatible C (bien que dans GCC, cela fonctionne généralement bien).extern "C"
nécessité formelle, voir[dcl.link]
"Deux types de fonction avec des liens de langage différents sont des types distincts même s'ils sont par ailleurs identiques." et[expr.call]
"L'appel d'une fonction via une expression dont le type de fonction est différent du type de fonction de la dé fi nition de la fonction appelée entraîne un comportement indéfini"Personnellement, l'approche la plus compatible, facile à implémenter et à comprendre que j'ai trouvée est de fournir simplement une fonction "wrapper", compatible avec l'interface C attendue, qui appelle en interne la méthode (et, dans le cas où elle n'est pas statique, instancier ou utiliser une instance existante pour ce faire). Cela pourrait être vu comme une sorte de variation du modèle de conception de l'adaptateur.
la source
static
je l'ai vu comme une méthode et, pour une raison quelconque, je n'ai pas réalisé qu'il ne passait pas lethis
pointeur comme premier argument (et le débat suivant sur l'utilisation de cestd::bind
renforcement). Mais oui, vous avez absolument raison! (Désolé pour la double réponse!)static
a au moins trois significations différentes et distinctes. Et vous les mélangerez si vous ne faites pas attention. Je dirais qu'il est vraiment utile de comprendre les distinctions entre les différentes utilisations destatic
, car chacune est un excellent outil à part entière.