Sie haben ein paar Optionen:
1) Magie Fehlerwert. Nicht immer gut genug, aus dem Grund, den du beschreibst. Ich denke in der Theorie für diesen Fall könnten Sie ein NaN zurückgeben, aber ich empfehle es nicht.
2) Legen Sie fest, dass das Popup nicht zulässig ist, wenn der Stapel leer ist. Dann geht Ihr Code entweder davon aus, dass er nicht leer ist (und wird nicht definiert, wenn dies der Fall ist) oder behauptet.
3) Ändern Sie die Signatur der Funktion, so dass Sie Erfolg oder Misserfolg zeigen können.
int pop(double *dptr)
{
if(sp > 0) {
*dptr = val[--sp];
return 0;
} else {
return 1;
}
}
Dokument als „Bei Erfolg 0 zurück und schreibt den Wert an der Stelle, auf die dptr On Fehler, gibt einen Wert ungleich Null zurück. "
Optional können Sie den Rückgabewert oder errno
verwenden, um den Grund für einen Fehler anzugeben, obwohl es für dieses spezielle Beispiel nur einen Grund gibt.
4) Übergeben Sie ein "Ausnahme" -Objekt per Zeiger in jede Funktion und schreiben Sie bei einem Fehler einen Wert darauf. Der Anrufer prüft sie dann oder nicht, je nachdem, wie sie den Rückgabewert verwenden. Das ist ähnlich wie "errno", aber ohne dass es ein fadenweiter Wert ist.
5) Wie andere bereits gesagt haben, implementieren Sie Ausnahmen mit setjmp/longjmp. Es ist machbar, erfordert aber entweder die Übergabe eines zusätzlichen Parameters (das Ziel des longjmp, das bei einem Fehler ausgeführt werden soll) oder das Ausblenden in globals. Es macht auch die typische Ressourcenhandhabung im C-Stil zu einem Albtraum, denn man kann nichts nennen, was über die Stack-Ebene hinausspringen könnte, wenn man eine Ressource hält, für die man verantwortlich ist.
Ich stimme dem nicht zu, denn selbst wenn ich verstehe, was du meinst, würde ich niemandem, der von java/C# land kommt, die Annahme geben, dass setjmp/longjmp in irgendeiner Weise die 'Lösung' für 'wo ist meine Ausnahme?' – Jonke
Beachten Sie, dass sehr wenig C-Code aus historischen Gründen setjmp/longjmp verwendet. Fehlercodes sind die übliche C-Art. Fehlercodes sind nicht sehr gut; Das Fehlen von Ausnahmen in C ist ein Hauptgrund, warum modernere Sprachen besser sind. – Nelson
ANSI hat 'setjmp' so codiert, dass es garantiert funktioniert (zumindest wenn der Compiler dem Standard entspricht), aber Stack Switch und Parallelität nicht standardisiert sind, so ist es immer noch ein Problem, ein sicheres Threads Paket zu schreiben für C (sogar mit asm für den Kontextwechsel), weil ein Compiler * könnte * (obwohl es unwahrscheinlich sein könnte) Optimierungen durchführen und transformiert , die Annahmen im Thread-Paket zu brechen. – Jonke