switch significa salir que para for consola comando c++ c callback language-lawyer extern

c++ - significa - salir de if c#



Extern "C" para la función de devolución de llamada estática del miembro (1)

Deseo proporcionar una función de devolución de llamada para el código escrito en Haskell (GHC). Utiliza los tipos de funciones similares a GCC compilador C para exportar / importar funcionalidad e interoperar en tiempo de ejecución con mi código.

Tengo que proporcionar una función de devolución de llamada, que de hecho acepte this puntero a la clase y simplemente llame a su método:

struct C { int f(int i) { ; } static int f_callback(void * self, int i) { static_cast< C * >(self)->f(i); } };

Lógicamente, f_callback es parte de la clase C , por lo que lo coloqué en el ámbito del espacio de nombres correspondiente.

Pero me preocupa si debo usar la especificación del lenguaje extern "C" (la convención de llamadas es importante aquí, no el cambio de nombre). Es posible declarar y definir la función extern "C" en el espacio de nombres simple, hay un par de reglas especiales para las funciones extern "C" definidas con el mismo nombre en diferentes espacios de nombres, pero no hay distinción entre el espacio de nombres del alcance de clase y simple espacio de nombres uno.

¿Es posible definir static extern "C" en el alcance de la clase?


La devolución de llamada externa no está vinculada, por diseño, a una clase específica.

Convertirlo en un miembro estático de la clase es quizás agradable de acuerdo con las partes internas de su código, pero tergiversa la realidad.

Por lo tanto, aconsejo que sea una función externa independiente "C". Esto evita malentendidos y resalta suposiciones (por ejemplo, que se supone que el yo es una C pero en realidad podría ser otra cosa). Si f () es público, todo esto estará muy limpio. Si fuera privado, necesitarías hacer que tu devolución de llamada sea un amigo y este acoplamiento ajustado se destacaría nuevamente.

La alternativa de contenedor simplemente agregaría un intermediario redundante para obtener el mismo resultado.