impedire l'utilizzo di funzioni prima dell'inizializzazione, come i costruttori in C

impedire l'utilizzo di funzioni prima dell'inizializzazione, come i costruttori in C


Questo è il modo in cui posso impedire che funA,funB,funC, ecc. vengano utilizzati prima di 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;
//..
}

Il problema con questo approccio è che se alcune di queste funzioni vengono chiamate all'interno di un ciclo
quindi "if (initialized!=INIT_KEY)" viene chiamato ancora e ancora, anche se non è necessario.


È un buon esempio del perché i costruttori sono utili ahah, se fosse un oggetto sarei sicuro che quando è stato creato, è stata chiamata l'inizializzazione, ma in C non so come farlo.


Qualsiasi altra idea è la benvenuta!


Risposte:


Usa il puntatore per funzionare.


In fase di costruzione, punta le funzioni alla funzione
che esegue l'inizializzazione richiesta, quindi aggiorna i puntatori alle funzioni in modo che puntino alle funzioni effettive che eseguono il lavoro.


L'ho fatto con matrici di puntatori a funzioni membro in una classe. La classe ha un numero intero interno che indica in quale stato si trova l'oggetto. Il numero intero viene utilizzato per indicizzare nell'array di puntatori alle funzioni membro... Lo stato 0 esegue l'inizializzazione. Lo stato 1 fa il lavoro, lo stato 2 riporta le cose allo stato 1.


Ha funzionato in modo molto pulito.