Yo uso C ++ en ESP-32. Al registrar un temporizador, tengo que hacer esto:
timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback);
timer_args.arg = this;
Aquí el cronómetro llama soundCallback
.
Y lo mismo al registrar una tarea:
xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle);
Entonces el método se inicia en una tarea separada.
GCC siempre me advierte sobre estas conversiones, pero funciona según lo planeado.
¿Es aceptable en el código de producción? ¿Hay una mejor manera de hacer esto?
std::bind
supone también el puntero de objeto como primer argumento de método?extern "C"
aquí? ¿Es importante el enlace C en este caso?__attribute__((cdecl))
, pero no lo haga). De lo contrario, no se garantiza que una función C ++ tenga una convención de llamada compatible con C (aunque en GCC normalmente funciona bien).extern "C"
es formalmente necesario, consulte[dcl.link]
"Dos tipos de funciones con diferentes enlaces de idiomas son tipos distintos, incluso si son idénticos". y[expr.call]
"Llamar a una función a través de una expresión cuyo tipo de función es diferente del tipo de función de la definición de la función llamada produce un comportamiento indefinido"Personalmente, el enfoque más compatible, fácil de implementar y fácil de entender que he encontrado es proporcionar una función de "envoltura", compatible con la interfaz C esperada, que llama internamente al método (y, en caso de que no sea estático, crear instancias o usar una instancia existente para hacer eso). Podría verse como una especie de variación del patrón de diseño del adaptador.
fuente
static
lo vi como un método y, por alguna razón, no me di cuenta de que no pasa elthis
puntero como primer argumento (y el siguiente debate sobre el uso destd::bind
reforzado). Pero sí, tienes toda la razón! (Perdón por la doble respuesta!)static
tiene al menos tres significados diferentes y distintos. Y los mezclará si no tiene cuidado. Diría que es realmente útil comprender las distinciones entre los diferentes usos destatic
, ya que cada uno es una gran herramienta por derecho propio.