Wie erhalte ich, was meine main-Funktion zurückgegeben hat?
Lesezeit: 6 Minuten
Jeegar Patel
Wenn wir in einem C-Programm Eingaben vom Terminal aus machen möchten, können wir dies folgendermaßen tun:
int main(int argc, char *argv[])
Auf die gleiche Weise, wenn wir den Rückgabewert von erhalten möchten main() Funktion dann, wie können wir es bekommen?
In jedem main() wir schreiben return 1 oder return 0; Wie kann ich wissen, was meine main() ist am Terminal zurückgekehrt?
Bearbeiten: 1
Ich verstehe es so echo $? wir können den Rückgabewert von erhalten main() aber es erlaubt mir nur, einen Wert kleiner als 125 (unter Linux) erfolgreich zurückzugeben. Ein größerer Rückgabewert als dieser kann von der nicht erfolgreich empfangen werden $ variable Also
warum ist int der Rückgabetyp von main()? Warum nicht behalten short int?
Bearbeiten2
Woher kann ich die Bedeutung des Fehlercodes erfahren, wenn main() gibt einen Wert größer als 125 zurück?
Es gibt keinen wirklichen Vorteil zu wählen short Über int es sei denn, Sie haben viele davon an derselben Stelle (Array oder Struktur). Es ist nicht schneller, eine zu haben short und auf modernen ABIs spart man mit der Wahl oft nicht einmal Platz. An einigen Stellen short ist langsamer, weil Sie beim Laden eine Zeichenerweiterung vornehmen müssen.
– Dietrich Ep
25. Dezember 2011 um 6:05 Uhr
überrascht von einem downvote..!!!
– Jeegar Patel
28. Dezember 2011 um 5:10 Uhr
@Jeegar Patel …. Sie müssen verstehen, dass einige Leute immer Hasser sind
– Mayukh Sarkar
3. Oktober 2015 um 16:58 Uhr
Ich denke, das hängt mit der Größe der CPU-Register zusammen.
– Leonardo Hernández
17. März um 21:17 Uhr
CB Bailey
Die meisten Shells speichern den Exit-Code des vorherigen run-Befehls in $? damit Sie es speichern oder anzeigen können.
$ ./a.out
$ echo $? # note - after this command $? contains the exit code of echo!
oder
$ ./a.out
$ exit_code=$? # save the exit code in another shell variable.
Beachten Sie, dass Sie unter Linux zwar eine zurückgeben int, sind im Allgemeinen nur Werte unter 126 sicher zu verwenden. Höhere Werte sind reserviert, um andere Fehler aufzuzeichnen, die auftreten können, wenn versucht wird, einen Befehl auszuführen, oder um aufzuzeichnen, welches Signal, falls vorhanden, Ihr Programm beendet hat.
Ich kenne keine UNIX-Variante, die mehr als die niedrigsten 8 Bits behält.
– Mike DeSimone
24. Dezember 2011 um 18:17 Uhr
@MikeDeSimone: Ich habe gerade die Bash-Manpage überprüft, und es ist tatsächlich weniger, als ich mich erinnerte. Wenn Sie versuchen, >125 zu verwenden, können Sie mit Werten kollidieren, die die Shell verwendet. Bei anderen Muscheln bin ich mir nicht sicher.
– CB Bailey
24. Dezember 2011 um 18:22 Uhr
Guter Punkt. Unix erlaubt bis zu 255 auf Betriebssystemebene, aber es schreibt nicht vor, dass die Shell all diese beibehält …
– Mike DeSimone
24. Dezember 2011 um 20:01 Uhr
Ihre Shell hat wahrscheinlich eine spezielle Variable $?, die den letzten vom Programm zurückgegebenen Wert enthält. Kurz nachdem Ihr Programm beendet ist, können Sie Folgendes ausführen:
echo $?
um den zurückgegebenen Wert zu sehen.
Nur die niedrigen 8-Bits werden interpretiert (deshalb muss der zurückgegebene Wert im Bereich 0-255 liegen). Die 127 kommt von der Darstellung negativer Ganzzahlen, die dann als vorzeichenlos interpretiert werden.
– Sidyl
24. Dezember 2011 um 18:27 Uhr
@sidyll: Ich denke, du meinst 7-Bit, nicht 8-Bit. Die niedrigen 8 Bits von -1 wären 255, die niedrigen 7 Bits sind 127.
– CB Bailey
24. Dezember 2011 um 19:13 Uhr
@eharvest: Ich verstehe deine Arbeit nicht. -1 sind viele Einsen, kürzen Sie das auf 8 Bit und behandeln Sie es als signiert und Sie haben immer noch -1, behandeln Sie es als unsigned und Sie haben 255.
– CB Bailey
24. Dezember 2011 um 23:40 Uhr
Unter DOS/Windows können Sie verwenden errorlevel innerhalb einer Batchdatei
executable optional arguments
if errorlevel 4 goto LABEL4
if errorlevel 3 goto LABEL3
if errorlevel 2 goto LABEL2
if errorlevel 1 goto LABEL1
:SUCCESS
echo SUCCESS; errorlevel 0
goto :eof
:LABEL1
echo FAILURE; errorlevel 1
goto :eof
:LABEL2
echo FAILURE; errorlevel 2
goto :eof
REM ...
Denken Sie nur daran, vom Größten zum Niedrigsten zu suchen, weil if errorlevel 42 bedeutet wirklich “wenn errorlevel 42 oder größer ist”
+1 @Alex: guter Punkt. Zu meiner Verteidigung habe ich das Tag erst bemerkt, nachdem ich angefangen hatte, die Antwort zu schreiben – und beschlossen, es zu vervollständigen und zu posten
– pmg
25. Dezember 2011 um 0:03 Uhr
+1 Gute Antwort. Ich habe nach einer Windows-spezifischen Methode gesucht, für die wahrscheinlich keine separate Frage erforderlich ist.
– AbdullahC
25. Dezember 2011 um 1:09 Uhr
+1, da es immer noch schön ist, dies in Zukunft an einem Ort nachschlagen zu können (obwohl ich kaum in Windows arbeite)
– Gnometorule
25. Dezember 2011 um 4:03 Uhr
Kommentare und Kleinigkeiten zusammenfassen, damit sie an einem Ort sind.
AC-Programm hat immer eine Exit-Codedie das Programm bei normaler Beendigung selbst entscheiden kann, indem es einen Wert aus der zurückgibt main Funktion oder durch Aufrufen der exit Funktion. Wenn das Programm abnormal beendet wird, beispielsweise durch einen Segmentierungsfehler, entscheidet das Betriebssystem über den Beendigungscode.
In Unix (Posix) ist der Exit-Code ein 8-Bit-Wert: 0-255. Es wird mit einigen anderen Metadaten zu einem kombiniert Status: Die anderen Metadaten enthalten Informationen darüber, ob das Programm normal beendet wurde oder nicht, ob es aufgrund eines Signals beendet wurde und wenn ja, welches Signal. Einzelheiten finden Sie unter warten (2) Handbuchseite.
In Unix ist auf der Shell der Status des vorherigen Befehls als zugänglich $? spezielle Variable. Da der Exit-Code nur 8 Bit lang ist und als Ganzzahl ohne Vorzeichen behandelt wird, wird ein negativer Wert in einen positiven umgewandelt: -1 wird zu 255. Ebenso wenig, wenn Sie einen Wert größer als 255 zurückgeben Es werden signifikante 8 Bits verwendet: 256 wird 0.
Der Rückgabetyp von main ist intstatt short oder char, weil es keinen besonderen Vorteil hat, es zu einem kleineren Typ zu machen, besonders zu diesem Zeitpunkt in der Geschichte, Jahrzehnte nachdem es beschlossen wurde. Es jetzt zu ändern, würde nur unnötige Komplikationen verursachen.
Wenn Sie ein Programm aus C ausführen möchten, bietet die Standardbibliothek die system Funktion, die praktischerweise den Status des Programms zurückgibt. (Beachten Sie, dass system führt Befehle über die Shell aus, und Sie müssen sehr vorsichtig sein, alles korrekt zu maskieren, wenn Sie dem Befehl extern bereitgestellte Dateinamen oder andere Dinge in der Befehlszeile geben.)
Für mehr Flexibilität können Sie andere Programme mit den Systemaufrufen ausführen fork, execl (oder eine seiner Varianten, siehe die ausführen(3) Handbuchseite) und wait (oben schon erwähnt). Dies ist leistungsfähig und flexibel, aber es können auch leicht Fehler gemacht werden, also lesen Sie unbedingt zuerst die Dokumentation und sehen Sie sich einige Beispielprogramme an. (Andererseits macht es sehr viel Spaß, dieses Zeug zu lernen.)
Shameeriff
Sie können die Exit-Werte mit dem Befehl basic linux command echo $? Die Fehlercodes sind Standard und die Details werden darin erklärt Verknüpfung
Die allgemeinen Codes sind
**
0- Erfolg
1- allgemeine Fehler
126- Berechtigungsproblem
127-Illegaler Befehl
128-Ungültige Argumente und schwerwiegende Fehler
255-Außerhalb des Bereichs**
Abhishek Mähne
in der Windows-Befehlszeile, um den Rückgabewert von der Hauptverwendung zu lesen echo %errorlevel%
(Code) return.c
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int i;
printf("Enter a number");
scanf("%d",&i);
if(i==2)
exit(1);
if(i==3)
exit(2);
return 0;
}
Es gibt keinen wirklichen Vorteil zu wählen
short
Überint
es sei denn, Sie haben viele davon an derselben Stelle (Array oder Struktur). Es ist nicht schneller, eine zu habenshort
und auf modernen ABIs spart man mit der Wahl oft nicht einmal Platz. An einigen Stellenshort
ist langsamer, weil Sie beim Laden eine Zeichenerweiterung vornehmen müssen.– Dietrich Ep
25. Dezember 2011 um 6:05 Uhr
überrascht von einem downvote..!!!
– Jeegar Patel
28. Dezember 2011 um 5:10 Uhr
@Jeegar Patel …. Sie müssen verstehen, dass einige Leute immer Hasser sind
– Mayukh Sarkar
3. Oktober 2015 um 16:58 Uhr
Ich denke, das hängt mit der Größe der CPU-Register zusammen.
– Leonardo Hernández
17. März um 21:17 Uhr