Moinsen,
Sono in qualche modo bloccato in un problema di progettazione. La lingua è ANSI-C.
Supponiamo di avere un congegno di moduli software:
- un modulo per la logica Logica
- (almeno) un modulo che esegue alcuni logging Logger
- due moduli, entrambi che danno una "cornice" per far funzionare il programma, diciamo
- uno con una GUI
- uno per linea di comando
- ...
Pertanto, la stessa logica potrebbe essere utilizzata in un comando e in una versione grafica del software. Logica deve registrare alcuni errori ma non dovrebbe sapere nulla del logger specifico in quanto potrebbe dipendere dal "frame". È ovvio fornire a Logica un puntatore a funzione che deve essere riempito dal fotogramma per associare il Logger utilizzato alla Logica .
Al Logging -Module (tutto il codice Pseudo-ANSI-C):
void Logger_Log(char *sLogText)
{
//do some stuff
}
In Logica -Module:
void Logic_PseudoLog(char *sLogText)
{
printf(sLogText);
}
void(* Logic_Log)(char *sLogText) = &Logic_PseudoLog;
void Logic_SetLogger(void(* LogFct)(char *sLogText))
{
Logic_Log = LogFct;
}
In GUI / Cmd-Line:
#include "Logger.h"
#include "Logic.h"
Logic_SetLogger(&Logger_Log);
Ora desidero introdurre diversi livelli di gravità per la registrazione e implementarli come enum in Logger :
//Logger.h:
typedef enum {
DEBUG,
INFO,
ERROR
} teLogLevel;
void Logger-Log(char *sLogText, teLogLevel eLevel);
E qui sorge il problema: il puntatore alla funzione di Logic deve avere la firma corretta. Per fare ciò, deve conoscere teLogLevel
. Pertanto Logica deve conoscere il Logger , esattamente il caso che volevo evitare con l'indiretto in primo luogo.
#include "Logger.h"
void(* Logic_Log)(char *sLogText, teLogLevel eLevel);
La situazione presentata è solo un esempio. Per favore non risolverlo dicendo qualcosa come "usa int
invece di enum
" o "crea tre funzioni per i livelli". La domanda di bottemline è:
Come gestire le enumerazioni in un punto di riferimento indiretto con functionpointer in ANSI-C?
Come "iniettare" enum in un modulo, che non dovrebbe ora sull'origine delle enumerazioni?