Tengo una clase que solo tiene miembros estáticos.Llamando punteros a funciones C++ de las bibliotecas C
Me gustaría registrar una de sus funciones miembro (VerifyClean en el código a continuación) para llamar al salir, usando la función de biblioteca "atexit".
El C++ FQA dice que debo especificar extern "C" para la función que deseo registrar de esta manera, como en el siguiente ejemplo.
class Example
{
public:
static void Initialize();
static void DoDirtyStuff {++dirtLevel;}
static void CleanUpStuff {--dirtLevel;}
private:
static void VerifyClean();
// DOESN'T COMPILE: extern "C" static void VerifyClean();
static int dirtLevel;
}
int Example::dirtLevel;
extern "C" void Example::VerifyClean() // DO I NEED extern "C" HERE?
{
assert(dirtLevel == 0);
}
void Example::Initialize()
{
dirtLevel = 0;
atexit(&VerifyClean);
}
¿De verdad tengo que usar extern "C"?
¿La respuesta cambia si reemplazo "atexit" con una función que no es de biblioteca (implementado en el plano C)?
Si la función VerifyClean fuera pública y decidiera llamarla directamente desde el código C++, ¿obtendría errores de enlace o bloqueos en el tiempo de ejecución? Pregunto esto porque la declaración no menciona en absoluto el término "C", por lo que el código normal de C++ podría manejar la llamada de función incorrectamente. Esto funciona bien en mi sistema MS Visual Studio 2005.
¿Por qué tener una clase con funciones sólo estáticas ? Y el FQA no es un buen lugar para aprender sobre C++. –
"FQA considerado nocivo" – jkerian
El C++ FQA es un recurso mucho más confiable para aprender C++ que las preguntas frecuentes. –