Das ist in der Tat eine übliche Konvention,
0 bei keinem Fehler und einen Wert != 0 bei einem Fehler
zurückzugeben.
Wenn die Fehlercodes eine Bedeutung haben, dann sollten diese als
#defines in einer Headerdatei dokumentiert werden; eine Funktion, die
diese Werte in eine Klartextrepräsentation übersetzt, ist beim Einsatz
auf µCs sicherlich verschmerzbar, beim Einsatz auf Systemen mit mehr
Resourcen aber sehr praktisch.
Es gibt allerdings auch andere Ansätze; manche Systeme geben einen Wert
!= 0 zurück, wenn alles in Ordnung ist, und 0, wenn ein Fehler
aufgetreten ist. Den Fehlercode muss man dann mit GetLastError() oder
einer vergleichbaren Funktion bestimmen.
Sofern die Funktion ein Objekt (Handle, Pointer) oder dergleichen
zurückgibt, ist das auch sinnvoll (Beispiel: fopen).
Eine weitere Variante ist die Verwendung vorzeichenbehafteter
Rückgabewerte. Negative Werte sind als Fehler anzusehen, positive Werte
sind gültige Resultate ...
Recht unpraktisch ist es, wenn eine Library mehrere Varianten mischt,
wie es beispielsweise die Win32-API ganz munter treibt. Einheitlichkeit
erfreut den Anwender.
Du siehst:
Es gibt kein eindeutiges Rezept; es kommt immer auf den spezifischen
Anwendungsfall an.