Ich benutze C ++ auf ESP-32. Bei der Registrierung eines Timers muss ich Folgendes tun:
timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback);
timer_args.arg = this;
Hier ruft der Timer soundCallback
.
Und das Gleiche beim Registrieren einer Aufgabe:
xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle);
Die Methode wird also in einer separaten Task gestartet.
GCC warnt mich immer vor diesen Konvertierungen, aber es funktioniert wie geplant.
Ist es im Produktionscode akzeptabel? Gibt es einen besseren Weg, dies zu tun?
std::bind
auch einen Objektzeiger als erstes Methodenargument an?extern "C"
hier? Ist die C-Verknüpfung in diesem Fall wichtig?__attribute__((cdecl))
, aber bitte tun Sie das nicht). Es ist nicht garantiert, dass eine C ++ - Funktion eine C-kompatible Aufrufkonvention hat (obwohl dies in GCC normalerweise gut funktioniert).extern "C"
formal erforderlich ist, finden Sie unter[dcl.link]
"Zwei Funktionstypen mit unterschiedlichen Sprachverknüpfungen sind unterschiedliche Typen, auch wenn sie ansonsten identisch sind." und[expr.call]
"Das Aufrufen einer Funktion über einen Ausdruck, dessen Funktionstyp sich vom Funktionstyp der Definition der aufgerufenen Funktion unterscheidet, führt zu einem nicht definierten Verhalten"Persönlich besteht der kompatibelste, einfach zu implementierende und leicht zu verstehende Ansatz darin, nur eine "Wrapper" -Funktion bereitzustellen, die mit der erwarteten C-Schnittstelle kompatibel ist und die Methode intern aufruft (und, falls sie nicht statisch ist, instanziieren oder eine vorhandene Instanz verwenden, um dies zu tun). Es könnte als eine Art Variation des Adapter-Design-Musters angesehen werden.
quelle
static
sah ich es als eine Methode und aus irgendeinem Grund wurde mir nicht klar, dass es denthis
Zeiger nicht als erstes Argument übergibt (und die folgende Debatte über die Verwendung vonstd::bind
verstärktem es). Aber ja, du hast absolut recht! (Sorry für die doppelte Antwort!)static
hat mindestens drei verschiedene, unterschiedliche Bedeutungen. Und Sie werden sie verwechseln, wenn Sie nicht aufpassen. Ich würde sagen, es ist wirklich hilfreich, die Unterschiede zwischen den verschiedenen Verwendungen von zu verstehenstatic
, da jedes für sich ein großartiges Werkzeug ist.