atexit für nicht void Funktion
-
Hallo Leute,
ich brauch mal wieder euren Rat.
Ich habe eine ReadConfig-Funktion, welche mir eine xml einliest.
Zuerst wird geprüft, ob sie existiert.
Wenn ja, wird überprüft, ob sie leer ist.
Dann wird eingelesen bzw die Struktur überprüftJetzt möchte ich, dass, wenn es Fehler in der Struktur gibt die aktuelle Funktion verlassen wird, da der nachfolgende Code nicht ausgeführt werden soll.
Dafür habe ich die Funktion atexit gefunden, die allerdings eine Funktion ohne Parameter fordert, was ich nicht bieten kann, da ich das file übergebe.
Gibt es eine andere Funktion oder Art wie ich das schaffe ?
void ReadConfig(const char* file){ XML_Parser parser = XML_ParserCreate(NULL); XML_SetElementHandler(parser, start, end); XML_SetCharacterDataHandler(parser, value); int len = 0; char val[1024] = {}; FILE *fh = fopen(file, "r"); char buffer[100]; if( fh == NULL ) { // error } else { if( (fread(val, sizeof(char), sizeof(val), fh)) == NULL) { // error } else { while(len = fread(val, sizeof(char), sizeof(val), fh)) { if(0 == XML_Parse(parser, val, len, len < 1024)) { int code = XML_GetErrorCode(parser); const char *msg = (const char *)XML_ErrorString((XML_Error)code); // ReadConfig soll komplett verlassen werden atexit(ReadConfig(void)); // exit current function } } handleGeneralConfig(configGroups["GENERAL"]); ... } } XML_ParserFree(parser); }
-
Dafür gibt es Exceptions.
-
roflo schrieb:
Dafür gibt es Exceptions.
+ RAII
-
atexit
verlässt nicht die aktuelle Funktion, sondern registriert einen Funktionspointer auf eine Funktion, die beim Beenden des Programms noch ausgeführt wird. Das kann entweder nach dem Verlassen dermain
Funktion sein, oder durch einen expliziten Aufruf vonexit
(der das Programm beendet).
-
Aktuelle Funktion verlassen geht einfach durch ein
return
. Da deine ReadConfig Funktion aber keinen Rückgabewert hat merkt keine der nachfolgenden Funktionen das etwas schief gelaufen ist.
-
@sebi707
Vielen Dank, genau das, was ich brauche
-
Falls du auf Ausnahmen setzt (was unbedingt getan werden sollte), solltest du auch auf fstream etc setzen. Schließlich wird der FILE*-Dateihandle dann nicht freigegeben, jedoch werden alle Destruktoren lokaler Variablen, wie beim normalen verlassen einer Funktion, aufgerufen.