Sollte ich return TRUE / FALSE-Werte aus eine C-Funktion?
Nach der Programmierung in C für mehrere Jahre, ich erkannte, dass ich ignoriert und die C-Konvention der Rückgabe von null aus eine Funktion, um anzuzeigen, Erfolg. Die Konvention scheint semantisch falsch, mich als null ist natürlich falsch. Das problem ist, mag ich Namen, Funktionen wie is_valid_foobar()
, und um zu empfangen, die das übereinkommen von 'false bedeutet Erfolg, würde ich nur noch vage...
das ist statt:
if ( ! is_valid_foobar() ) {
return (error);
}
Andere Programmierer schreiben:
if ( validate_foobar() ) {
return (error);
}
Und meine Implementierung sieht so aus:
int is_valid_foobar (int foobar ) {
if ( foobar < MAX_ALLOWED ) {
return TRUE;
}
return FALSE;
}
Habe ich nicht wirklich gefangen flak für diese in code-reviews. Also ich denke, es ist nicht so eine schreckliche Angewohnheit, aber es ist 'unkonventionell'. Ich bin gespannt, was die Leute denken.
Ich bin sehr vorsichtig über die Entscheidungen, die ich für Funktions-und Variablennamen, und ein typisches review-Kommentar "der code ist wirklich klar", und weiter, es stört mich nicht überhaupt zu zu können, geben eine zusätzliche !
an, der vor dem Aufruf der Funktion. Aber was sagst du, oh mächtigen von S. O?
InformationsquelleAutor Leonard | 2009-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde sagen, beides ist korrekt, für verschiedene Zwecke:
Wenn Sie die Durchführung einer einfachen " go/no-go-Validierung, beispielsweise is_numeric(), die dann true und false funktioniert gut.
Etwas aufwendiger, 0==Erfolg-Paradigma ist hilfreich, dass es ermöglicht mehr als eine Fehlerbedingung zurückgegeben werden.
In diesem Fall, der Anrufer kann einfach test gegen 0, oder prüfen die nicht 0 zurückgibt, für eine spezifische Erklärung des Fehlers. z.B. einen Datei-öffnen-Aufruf kann fehlschlagen, aufgrund der nicht-Existenz, nicht genügend Berechtigungen, etc.
Diese Nutzung ermöglicht auch die Formulierung "wenn (int e=foo()){/*Fehler behandeln*/};", das Aussehen kann umständlich zu Leuten erhöht, die auf mehr featurefull Sprachen, aber sauber und glatt von c-Normen.
InformationsquelleAutor Paul Roub
Des übereinkommens nicht genau das, was Sie scheinen zu denken. Prozesse sollten beendet mit einer 0-status, um anzuzeigen, Erfolg, und Funktionen , dass die Rückgabe von Fehlercodes oft verwenden Sie 0, um anzuzeigen, "kein Fehler". Aber als boolean, 0 sollte bedeuten, false und ungleich null bedeuten sollte, wahr. Verwenden Sie 0 für den booleschen Wert true erhalten Sie auf The Daily WTF irgendwann.
InformationsquelleAutor Chuck
Es ist schon eine Weile her, seit ich C programmiert, aber ich denke, Sie sprechen über zwei verschiedene Arten von Funktionen, hier:
is_foo
ist eine Funktion, die prüft, für einige Eigenschaft foo und zurück0
(false
) oder nicht-0
(true
) an den boolean-Wert dieser Eigenschaft. Beim Aufruf dieser Funktionen keine Fehler-Zustand zu erwarten ist (und wenn es passiert, es ist abgebildet auf einer dieser Werte).foo
ist eine Funktion, die führt die Aktion aus foo. Es gibt0
auf Erfolg und eine nicht-0
Wert auf Fehler.InformationsquelleAutor Joachim Sauer
Ich bin nicht sicher, ich bin damit einverstanden, dass es ist eine Konvention der "Rückkehr null-Funktion, um anzuzeigen, Erfolg."
AFAIK die Konvention ist, dass die null ist false, und alle nonzeros sind wahr, im Fall von Prädikaten.
Jedoch, dieses übereinkommen nur Anwendung auf die offensichtliche Prädikate, die Boolesche Werte (z.B. true/false). Wenn das primäre Ziel einer Funktion ist nicht auf einen booleschen Wert zurück (z.B. printf, fopen, etc.), dann die return-Wert wird verwendet, um anzuzeigen, Gründe für Fehler, und dann können Sie nehmen Sie die UNIX-Konvention "Stille oder 0, es sei denn, es gibt ein problem".
Als für Rückgabewerte, es ist nichts falsch mit der Verwendung fester Werte zurückgeben, es macht alles bequemer.
Das große Risiko, IMHO, ist, dass viele Menschen erklären Ihre eigenen Konstanten, und, wenn andere die gleichen Dateien, Sie beginnen Sie zu laufen, in Konflikte mit Ihren eigenen Konstanten. So Ihr WAHR/FALSCH und in Konflikt mit jemand anderem WAHR/FALSCH auf der ganzen Linie.
InformationsquelleAutor Uri
Insbesondere wenn Sie den Namen Ihrer Funktion is_foo(), die standard-C-character-Funktionen (isdigit(), isupper(), etc) sind ein gutes Beispiel für das tun es Ihren Weg.
InformationsquelleAutor IvyMike
C hat kein Konzept boolescher Wert ungleich 0 als falsch und alles andere wahr ist.
Die Idee der Rücknahme der 0 kommt, wenn man ein return-code, der angibt, was der Fehler ist. Wenn Sie nicht tun, ist ein return-code, dann gibt es nichts falsch mit der Behandlung von 1 und 0 als true und false. Nach allem, WAHR und FALSCH sind nur typedefs für 1 und 0 in C.
Diese sollten gut dokumentiert aber, und Ihre Funktion Kommentare sagen sollte ausdrücklich "Gibt TRUE oder FALSE zurück".
Könnte man auch schreiben if (is_invalid_foobar()), das könnte die Erklärung einfach zu verstehen und noch semantisch korrekt.
InformationsquelleAutor Costa Rica Dev
Nicht so sehr ein C-Konvention als ein UN*X-shell. Betrachten Sie die Standard-C-iasalpha(), isdigit (), etc-Funktionen. Sie alle zurück, die nicht null ist, zeigen Erfolg. Bottom line: in der C 'wahr' ist nicht null.
InformationsquelleAutor
Es ist nur schlimm, wenn es verbrennt. Wenn Sie noch nie trace alle bugs zu diesem, ich würde sagen, Sie sind OK. Was wichtiger ist, ist die Bemerkung über die Funktion "beginnt mit", "null für..."
"Ungleich null ist ein Fehler" - Konvention wird verwendet, wenn versucht zu sagen warum zusammen mit der error-flag.
InformationsquelleAutor gbarry
mir eigentlich die Prüfung gegen 0 wirkt natürlicher, und der compiler optimiert es sowieso, so dass ich zu schreiben wie zum Beispiel
wenn ( check_foo == 0 )
//etwas tun
InformationsquelleAutor
Rückgabewert von einer Funktion-Konventionen für True und False ODER Erfolg und Fehler:
InformationsquelleAutor S3.
Es ist immer noch völlig willkürlich um 1 oder 0. Nur konsequent sein und wenn es gibt Fehler codes, zumindest Kommentar was Sie bedeuten irgendwo.
InformationsquelleAutor user1701047