Lasst uns sagen, dass ich eine Reihe von Fehlercodes haben in meiner Anwendung header.h
wie:Elegante Abbildung von C Fehler definiert reiht
#define SOMETHING_WENT_WRONG -1
#define SOLAR_FLARE_DECTECTED -2
#define ANTS_IN_YOUR_CPU -3
kehre ich diese als int
aus verschiedenen API-Funktionen. Ich möchte eine saubere Möglichkeit bieten, eine Funktion anzubieten, die der Benutzer aufrufen kann, um diese auf aussagekräftigere Fehlermeldungen abzubilden, während der Header kurz gehalten wird.
Das heißt, während ich könnte immer so etwas tun:
const char *getErrorMessage(int errCode) {
switch (errCode) {
case SOMETHING_WENT_WRONG:
return "Something bad happened, but I don't know more than that";
case SOLAR_FLARE_DECTECTED:
return "A solar flare, rather than programmer error, has caused a malfunction";
case ANTS_IN_YOUR_CPU:
return "Ants have nested in your CPU, causing all ALU functions to fail";
default:
return "I heard you like errors in your error handling. So ...";
}
}
ich wirklich zweimal die Vervielfältigung unter Angabe der Fehler Makro vermeiden will (DRY) und mit der Definition und die Fehlerzeichenfolge in zwei verschiedene Orte (was es nicht offensichtlich macht, dass diejenigen, die einen Fehlercode hinzufügen, auch die Fehlerfunktion aktualisieren müssen).
So suche ich nach einem Ansatz, der nur 1 Zeile (ish) pro Fehlercode verwendet - der Makroname, int
Fehlercode und Nachricht alle zusammen.
Bonuspunkte, wenn ich die Fehlerzeichenfolge auslassen kann und die Fehlerzeichenfolge nur den Namen des Zeichenfolgenmakros haben (z. B. für den ersten Fehler).
Ich mache mir keine Sorgen über die Nachschlageleistung, also ist es zum Beispiel gut, ein Array zu erstellen und in der Lookup-Funktion durchzusehen.
[Xmacros] (http://www.drdobbs.com/the-new-c-x-macros/184401387) kann den Trick machen, obwohl sie einige (nicht zu) tiefe C wissen müssen, um zu verstehen. – StoryTeller
Warum geben Sie die Zeichenfolgenliterale im Makroformat nicht selbst zurück? NULL zeigt keinen Fehler an. Die Leistung ist gleich. – 2501
@ 2501 - interessant, aber es ist einfach kein typisches Fehlerbehandlungs-Idiom in C. Es hat Probleme, zB wenn der Aufrufer den Fehlercode überprüfen möchte (sie müssten 'strcmp' anstelle von' == 'verwenden , und je nachdem, wie die Strings verwendet wurden, kann ich den Stringtxt in Zukunft möglicherweise nicht ändern.Wenn ich '#define SOME_ERROR 'noch immer ein Fehlermuster verwende, kann der Linker dies tun oder auch nicht Kombiniere die identischen Strings, die linkerabhängiges Verhalten verursachen können, wenn Leute die Zeiger vergleichen, usw. – SODIMM