evitar el uso de funciones antes de la inicialización, como constructores en C

evitar el uso de funciones antes de la inicialización, como constructores en C


Esta es la forma en que evito que funA, funB, funC, etc. se usen antes de init


#define INIT_KEY 0xC0DE //any number except 0, is ok
static int initialized=0;
int Init()
{
//many init task
initialized=INIT_KEY;
}
int funA()
{
if (initialized!=INIT_KEY) return 1;
//..
}
int funB()
{
if (initialized!=INIT_KEY) return 1;
//..
}
int funC()
{
if (initialized!=INIT_KEY) return 1;
//..
}

El problema con este enfoque es que si alguna de esas funciones se llama dentro de un bucle
entonces "if (initialized!=INIT_KEY)" se llama una y otra vez, aunque no es necesario.


Es un buen ejemplo de por qué los constructores son útiles jaja. Si fuera un objeto, estaría seguro de que cuando se creó, se llamó a la inicialización, pero en C, no sé cómo hacerlo.


¡Cualquier otra idea es bienvenida!


Respuestas:


Utilice el puntero para funcionar.


En el momento de la construcción, apunte las funciones a la función
que realiza la inicialización requerida, luego actualice los punteros de función para que apunten a las funciones reales que realizan el trabajo.


He hecho esto con matrices de puntero a funciones miembro en una clase. La clase tiene un entero interno que dice en qué estado se encuentra el objeto. El entero se usa para subíndice en la matriz de puntero a funciones miembro... El estado 0 hace el inicio. El estado 1 hace el trabajo, el estado 2 vuelve a poner las cosas en el estado 1.


Funcionó muy limpiamente.