Was ist der richtige (effizienteste) Weg, um die main()
Funktion in C und C ++ zu definieren - int main()
oder void main()
- und warum? Wenn int main()
dann return 1
oder return 0
?
Es gibt zahlreiche Duplikate dieser Frage, darunter:
- Was sind die gültigen Signaturen für die
main()
Funktion von C ? - Der Rückgabetyp der
main()
Funktion - Unterschied zwischen
void main()
undint main()
? main()
Signatur in C ++- Was ist die richtige Erklärung von
main()
? - Für C ++ mit einer sehr guten Antwort. - Arten von
main()
Funktionen in C - Rückgabetyp der
main()
Methode in C. int main()
vsvoid main()
in C.
Verbunden:
- C ++ -
int main(int argc, char **argv)
- C ++ -
int main(int argc, char *argv[])
- Ist
char *envp[]
als drittes Argumentmain()
tragbar? - Muss die
int main()
Funktion in allen Compilern einen Wert zurückgeben? - Warum muss
main()
der Benutzer den Funktionstyp in C und C ++ definieren? - Warum
int main(){}
kompiliert? - Rechtliche Definitionen von
main()
in C ++ 14?
c++
c
return-value
main
return-type
Joel
quelle
quelle
main
wird einmal aufgerufen (und kann in C ++ nur einmal aufgerufen werden: keine Rekursion). Wenn Sie nicht möchten, dass die Ausführung viel Zeit inmain
Anspruch nimmt, rufen Sie das Programm nicht häufig auf: Lassen Sie das Programm die Wiederholung implementieren.#include
Aussagenreturn
inmain(...)
auf einem Embedded - Gerät, geht das System in einen unvorhersehbaren Zustand und die Waschmaschine wird sich selbst bewusst und versucht , dich zu töten. Also verwenden wirvoid main()
in diesem Fall. Dies ist eine branchenübliche Praxis für Bare-Metal-Embedded.Antworten:
Der Rückgabewert für
main
gibt an, wie das Programm beendet wurde. Der normale Ausgang wird durch einen Rückgabewert von 0 von dargestelltmain
. Ein abnormaler Ausgang wird durch eine Rückkehr ungleich Null signalisiert, es gibt jedoch keinen Standard für die Interpretation von Codes ungleich Null. Wie von anderen angemerkt,void main()
ist dies nach dem C ++ - Standard verboten und sollte nicht verwendet werden. Die gültigen C ++ -main
Signaturen sind:und
das ist äquivalent zu
Es ist auch erwähnenswert, dass in C ++
int main()
ohne return-Anweisung belassen werden kann. An diesem Punkt wird standardmäßig 0 zurückgegeben. Dies gilt auch für ein C99-Programm. Obreturn 0;
weggelassen werden soll oder nicht, steht zur Debatte. Der Bereich der gültigen Hauptsignaturen des C-Programms ist viel größer.Effizienz ist kein Problem mit der
main
Funktion. Es kann gemäß dem C ++ - Standard nur einmal eingegeben und verlassen werden (Markieren des Starts und der Beendigung des Programms). Für C ist eine erneute Eingabemain()
zulässig, sollte jedoch vermieden werden.quelle
Die akzeptierte Antwort scheint auf C ++ ausgerichtet zu sein, daher dachte ich, ich würde eine Antwort hinzufügen, die sich auf C bezieht, und dies unterscheidet sich in einigen Punkten.
ISO / IEC 9899: 1989 (C90):
main()
sollte wie folgt deklariert werden:Oder gleichwertig. Zum Beispiel
int main(int argc, char *argv[])
entspricht dem zweiten. Außerdem kann derint
Rückgabetyp weggelassen werden, da dies eine Standardeinstellung ist.Wenn eine Implementierung dies zulässt,
main()
kann dies auf andere Weise deklariert werden. Dadurch wird die Programmimplementierung jedoch definiert und ist nicht mehr streng konform.Der Standard definiert 3 Werte für die Rückgabe, die streng konform sind (dh nicht auf dem durch die Implementierung definierten Verhalten beruhen):
0
undEXIT_SUCCESS
für eine erfolgreiche Beendigung undEXIT_FAILURE
für eine nicht erfolgreiche Beendigung. Alle anderen Werte sind nicht standardisiert und die Implementierung definiert.main()
mussreturn
am Ende eine explizite Anweisung enthalten, um undefiniertes Verhalten zu vermeiden.Schließlich ist aus Sicht der Standards nichts Falsches daran,
main()
von einem Programm aus aufzurufen .ISO / IEC 9899: 1999 (C99):
Für C99 ist alles wie oben, außer:
int
Rückgabetyp darf nicht weggelassen werden.main()
. Wenn Sie dies tun undmain()
fertig sind, gibt es eine implizitereturn 0
.quelle
Standard C - Hosted Environment
Für eine gehostete Umgebung (das ist die normale) lautet der C11-Standard (ISO / IEC 9899: 2011):
Programmbeendigung in C99 oder C11
Der von zurückgegebene Wert
main()
wird implementierungsdefiniert an die 'Umgebung' übertragen.Beachten Sie, dass dies
0
als "Erfolg" vorgeschrieben ist. Sie könnenEXIT_FAILURE
undEXIT_SUCCESS
von verwenden,<stdlib.h>
wenn Sie es vorziehen, aber 0 ist gut etabliert, ebenso wie 1. Siehe auch Exit-Codes größer als 255 - möglich? .In C89 (und damit in Microsoft C) gibt es keine Aussage darüber, was passiert, wenn die
main()
Funktion zurückgibt, aber keinen Rückgabewert angibt. es führt daher zu undefiniertem Verhalten.Standard C ++ - Gehostete Umgebung
Der C ++ 11-Standard (ISO / IEC 14882: 2011) lautet:
Der C ++ - Standard sagt ausdrücklich "Es [die Hauptfunktion] soll einen Rückgabetyp haben
int
, aber ansonsten ist sein Typ implementierungsdefiniert" und erfordert, dass dieselben zwei Signaturen wie der C-Standard als Optionen unterstützt werden. Ein 'void main ()' ist vom C ++ - Standard direkt nicht zulässig, obwohl es nichts tun kann, um eine nicht standardmäßige Implementierung zu stoppen, die Alternativen zulässt. Beachten Sie, dass C ++ dem Benutzer das Aufrufen verbietetmain
(der C-Standard jedoch nicht).Es gibt einen Absatz von §18.5 Start und Beendigung im C ++ 11-Standard, der mit dem Absatz aus §7.22.4.4 identisch ist. Die
exit
Funktion im C11-Standard (oben zitiert), abgesehen von einer Fußnote (die dies einfach dokumentiertEXIT_SUCCESS
undEXIT_FAILURE
definiert ist in<cstdlib>
).Standard C - Gemeinsame Erweiterung
Klassischerweise unterstützen Unix-Systeme eine dritte Variante:
Das dritte Argument ist eine nullterminierte Liste von Zeigern auf Zeichenfolgen, von denen jede eine Umgebungsvariable ist, die einen Namen, ein Gleichheitszeichen und einen Wert (möglicherweise leer) hat. Wenn Sie dies nicht verwenden, können Sie trotzdem über '
extern char **environ;
' in die Umgebung gelangen . Diese globale Variable ist unter denen in POSIX insofern einzigartig, als sie keinen Header hat, der sie deklariert.Dies wird von der C-Norm als gemeinsame Erweiterung anerkannt, die in Anhang J dokumentiert ist:
Microsoft C.
Der Microsoft VS 2010- Compiler ist interessant. Die Website sagt:
Mir ist nicht klar, was passiert (welcher Exit-Code wird an das übergeordnete oder Betriebssystem zurückgegeben), wenn ein Programm mit beendet
void main()
wird - und die MS-Website ist ebenfalls still.Interessanterweise schreibt MS nicht die Version mit zwei Argumenten vor
main()
, die die C- und C ++ - Standards erfordern. Es wird nur eine Form mit drei Argumenten vorgeschrieben, wobei das dritte Argumentchar **envp
ein Zeiger auf eine Liste von Umgebungsvariablen ist.Auf der Microsoft-Seite werden auch einige andere Alternativen aufgeführt, für
wmain()
die breite Zeichenfolgen erforderlich sind, und einige weitere.Die Microsoft Visual Studio 2005- Version dieser Seite wird nicht
void main()
als Alternative aufgeführt. Die Versionen ab Microsoft Visual Studio 2008 tun dies.Standard C - Freistehende Umgebung
Wie bereits erwähnt, gelten die oben genannten Anforderungen für gehostete Umgebungen. Wenn Sie mit einer freistehenden Umgebung arbeiten (die Alternative zu einer gehosteten Umgebung), hat der Standard viel weniger zu sagen. In einer freistehenden Umgebung muss die beim Programmstart aufgerufene Funktion nicht aufgerufen werden,
main
und der Rückgabetyp unterliegt keinen Einschränkungen. Der Standard sagt:Der Querverweis auf Klausel 4 Konformität bezieht sich auf Folgendes:
Es fällt auf, dass der einzige Header, der für eine freistehende Umgebung erforderlich ist, die tatsächlich Funktionen definiert,
<stdarg.h>
(und selbst diese können und sind oft nur Makros) sind.Standard C ++ - Freistehende Umgebung
So wie der C-Standard sowohl gehostete als auch freistehende Umgebungen erkennt, erkennt auch der C ++ - Standard dies. (Zitate aus ISO / IEC 14882: 2011.)
Was ist mit der Verwendung
int main()
in C?Die Norm §5.1.2.2.1 der Norm C11 zeigt die bevorzugte Notation -
int main(void)
- aber es gibt auch zwei Beispiele in der Norm, die zeigenint main()
: §6.5.3.4 ¶8 und §6.7.6.3 ¶20 . Nun ist es wichtig anzumerken, dass Beispiele nicht „normativ“ sind. Sie sind nur zur Veranschaulichung. Wenn die Beispiele Fehler enthalten, wirken sie sich nicht direkt auf den Haupttext des Standards aus. Das heißt, sie weisen stark auf das erwartete Verhalten hin. Wenn der Standard alsoint main()
ein Beispiel enthält, deutet dies darauf hin, dass diesint main()
nicht verboten ist, auch wenn es nicht die bevorzugte Notation ist.quelle
int main(){ … }
gibt an, dass die Funktion keine Argumente akzeptiert, aber keinen Funktionsprototyp AFAICT bereitstellt. Dennmain()
das ist selten ein Problem; Dies bedeutet, dass bei rekursiven Aufrufen vonmain()
die Argumente nicht überprüft werden. Bei anderen Funktionen ist dies eher ein Problem. Wenn die Funktion aufgerufen wird, benötigen Sie wirklich einen Prototyp im Gültigkeitsbereich, um sicherzustellen, dass die Argumente korrekt sind.main()
rekursiv außerhalb von Orten wie IOCCC an. Ich habe ein Testprogramm, das dies tut - hauptsächlich aus Gründen der Neuheit. Wenn Sieint i = 0; int main() { if (i++ < 10) main(i, i * i); return 0; }
GCC haben und mit GCC kompilieren und nicht einschließen-Wstrict-prototypes
, wird es unter strengen Warnungen sauber kompiliert. Wenn dies dermain(void)
Fall ist , kann es nicht kompiliert werden.Ich glaube das
main()
sollte entwederEXIT_SUCCESS
oder zurückkehrenEXIT_FAILURE
. Sie sind definiert instdlib.h
quelle
EXIT_SUCCESS
undEXIT_FAILURE
weil einige historische Betriebssysteme (VMS?) Eine andere Zahl als 0 verwendeten, um den Erfolg anzuzeigen . Es ist heutzutage überall 0.exit(EXIT_SUCCESS)
, die immer das Richtige tat.Beachten Sie, dass die Standards C und C ++ zwei Arten von Implementierungen definieren: freistehend und gehostet.
Von C90 gehostete Umgebung
Zulässige Formulare 1 :
Bemerkungen:
Die beiden ersteren werden explizit als zulässige Formulare angegeben, die anderen sind implizit zulässig, da C90 "implizites int" für Rückgabetyp- und Funktionsparameter zulässt. Keine andere Form ist erlaubt.
C90 freistehende Umgebung
Jede Form oder jeder Name von main ist erlaubt 2 .
Von C99 gehostete Umgebung
Zulässige Formulare 3 :
Bemerkungen:
C99 hat "implicit int" entfernt und
main()
ist daher nicht mehr gültig.Ein seltsamer, mehrdeutiger Satz "oder auf eine andere implementierungsdefinierte Weise" wurde eingeführt. Dies kann entweder als "die Parameter
int main()
können variieren" oder als "main kann jede implementierungsdefinierte Form haben" interpretiert werden .Einige Compiler haben sich entschieden, den Standard auf die letztere Weise zu interpretieren. Man kann wohl nicht leicht sagen, dass sie nicht streng konform sind, indem man den Standard an sich zitiert, da er nicht eindeutig ist.
Es
main()
war jedoch wahrscheinlich (?) Nicht die Absicht dieses neuen Satzes , völlig wilde Formen von zuzulassen . Die C99-Begründung (nicht normativ) impliziert, dass sich der Satz auf zusätzliche Parameter zuint main
4 bezieht .Der Abschnitt zur Beendigung des Programms für gehostete Umgebungen wird dann weiter über den Fall diskutiert, in dem main nicht int 5 zurückgibt . Obwohl dieser Abschnitt nicht normativ dafür ist, wie main deklariert werden soll, impliziert er definitiv, dass main auch auf gehosteten Systemen vollständig implementierungsdefiniert deklariert werden kann.
C99 freistehende Umgebung
Jede Form oder jeder Name von main ist erlaubt 6 .
Von C11 gehostete Umgebung
Zulässige Formen 7 :
C11 freistehende Umgebung
Jede Form oder jeder Name von main ist zulässig 8 .
Beachten Sie, dass dies
int main()
in keiner der oben genannten Versionen als gültiges Formular für eine gehostete Implementierung von C aufgeführt wurde. In C im Gegensatz zu C ++()
und(void)
haben unterschiedliche Bedeutungen. Ersteres ist ein veraltetes Merkmal, das aus der Sprache entfernt werden kann. Siehe zukünftige Sprachanweisungen für C11:Gehostete C ++ 03-Umgebung
Zulässige Formen 9 :
Bemerkungen:
Beachten Sie die leere Klammer im ersten Formular. C ++ und C unterscheiden sich in diesem Fall, da dies in C ++ bedeutet, dass die Funktion keine Parameter akzeptiert. In C bedeutet dies jedoch, dass ein beliebiger Parameter verwendet werden kann.
C ++ 03 freistehende Umgebung
Der Name der beim Start aufgerufenen Funktion ist implementierungsdefiniert. Wenn es benannt ist
main()
, muss es den angegebenen Formularen 10 folgen :Gehostete C ++ 11-Umgebung
Zulässige Formulare 11 :
Bemerkungen:
Der Text der Norm wurde geändert, hat aber die gleiche Bedeutung.
C ++ 11 freistehende Umgebung
Der Name der beim Start aufgerufenen Funktion ist implementierungsdefiniert. Wenn es benannt ist
main()
, muss es den angegebenen Formularen 12 folgen :Verweise
ANSI X3.159-1989 2.1.2.2 Gehostete Umgebung. "Programmstart"
ANSI X3.159-1989 2.1.2.1 Freistehende Umgebung:
ISO 9899: 1999 5.1.2.2 Gehostete Umgebung -> 5.1.2.2.1 Programmstart
Begründung für den internationalen Standard - Programmiersprachen - C, Revision 5.10. 5.1.2.2 Gehostete Umgebung -> 5.1.2.2.1 Programmstart
ISO 9899: 1999 5.1.2.2 Gehostete Umgebung -> 5.1.2.2.3 Programmbeendigung
ISO 9899: 1999 5.1.2.1 Freistehende Umgebung
ISO 9899: 2011 5.1.2.2 Gehostete Umgebung -> 5.1.2.2.1 Programmstart
Dieser Abschnitt ist identisch mit dem oben genannten C99.
ISO 9899: 1999 5.1.2.1 Freistehende Umgebung
Dieser Abschnitt ist identisch mit dem oben genannten C99.
ISO 14882: 2003 3.6.1 Hauptfunktion
ISO 14882: 2003 3.6.1 Hauptfunktion
ISO 14882: 2011 3.6.1 Hauptfunktion
ISO 14882: 2011 3.6.1 Hauptfunktion
Dieser Abschnitt ist identisch mit dem oben genannten C ++ 03.
quelle
int my_startup_function ()
oderint my_startup_function (int argc, char *argv[])
kann sie zum Beispiel auchchar my_startup_function (long argc, int *argv[])
als Startfunktion haben? Ich denke nein, richtig? Ist das nicht auch mehrdeutig?main()
da es dann eine der aufgelisteten Signaturen verwenden muss. Ich würde mir vorstellen, dass dies am häufigsten vorkommtvoid my_startup_function ()
, da es keinen Sinn macht, auf freistehenden Systemen vom Programm zurückzukehren.main
? Tut mir leid, wenn das keine kluge Frage ist, aber ich konnte die Gründe dafür nicht verstehen.func()
der Entwurf selbst , obwohl er als veraltet angesehen wird,int main()
in seinen eigenen Beispielen verwendet wird.Bei Erfolg 0 zurückgeben und bei Fehler ungleich Null. Dies ist der Standard, der von UNIX- und DOS-Skripten verwendet wird, um herauszufinden, was mit Ihrem Programm passiert ist.
quelle
main()
In C89 und K & R C sind nicht spezifizierte Rückgabetypen standardmäßig 'int'.Wenn Sie keine return-Anweisung schreiben
int main()
, gibt der Abschluss{
standardmäßig 0 zurück.return 0
oderreturn 1
wird vom übergeordneten Prozess empfangen. In einer Shell geht es in eine Shell-Variable, und wenn Sie Ihr Programm aus einer Shell ausführen und diese Variable nicht verwenden, müssen Sie sich keine Gedanken über den Rückgabewert von machenmain()
.Siehe Wie kann ich feststellen, was meine Hauptfunktion zurückgegeben hat? .
Auf diese Weise können Sie sehen, dass es die Variable ist,
$?
die das niedrigstwertige Byte des Rückgabewerts von empfängtmain()
.In Unix- und DOS-Skripten
return 0
werden normalerweise bei Erfolg und bei Fehlern ungleich Null zurückgegeben. Dies ist der Standard, der von Unix- und DOS-Skripten verwendet wird, um herauszufinden, was mit Ihrem Programm passiert ist, und um den gesamten Ablauf zu steuern.quelle
$?
ist es keine Umgebungsvariable; Es ist eine vordefinierte (oder integrierte) Shell-Variable. Der Unterschied ist schwer zu erkennen, aber wenn Sieenv
(ohne Argumente) ausführen , wird die Umgebung gedruckt und$?
nicht in der Umgebung angezeigt.{
" sollte sein}
. SO erlaube ich mir nicht, eine so kleine Bearbeitung vorzunehmen.Beachten Sie, dass einige Betriebssysteme (Windows) den zurückgegebenen Wert auf ein einzelnes Byte (0-255) kürzen, obwohl Sie ein int zurückgeben.
quelle
unsigned
). Dies gilt auch für UNIX-Systeme mit 32-Bit-Ganzzahlen. UNIX-Shells auf beiden Systemen behalten jedoch normalerweise nur eine vorzeichenlose 8-Bit-Ganzzahl bei.Der Rückgabewert kann vom Betriebssystem verwendet werden, um zu überprüfen, wie das Programm geschlossen wurde.
Der Rückgabewert 0 bedeutet normalerweise OK in den meisten Betriebssystemen (die mir sowieso einfallen).
Sie können auch überprüfen, wenn Sie einen Prozess selbst aufrufen und feststellen, ob das Programm beendet und ordnungsgemäß beendet wurde.
Es ist NICHT nur eine Programmierkonvention.
quelle
Der Rückgabewert von
main()
zeigt an, wie das Programm beendet wurde. Wenn der Rückgabewert istzero
, bedeutet dies, dass die Ausführung erfolgreich war, während ein Wert ungleich Null darstellt, dass bei der Ausführung ein Fehler aufgetreten ist.quelle
Ich hatte den Eindruck, dass Standard angibt, dass main keinen Rückgabewert benötigt, da eine erfolgreiche Rückgabe auf dem Betriebssystem basiert (Null in einem könnte entweder ein Erfolg oder ein Fehler in einem anderen sein), daher war das Fehlen einer Rückgabe ein Hinweis für die Compiler, um die erfolgreiche Rückgabe selbst einzufügen.
Normalerweise gebe ich jedoch 0 zurück.
quelle
Die Rückgabe von 0 sollte dem Programmierer mitteilen, dass das Programm den Job erfolgreich beendet hat.
quelle
main()
normalen Signalen zurückgeben, ist ein Fehler aufgetreten. Die Rückgabe von 0 signalisiert Erfolg. Wenn Ihre Programme immer fehlschlagen, ist 1 in Ordnung, aber nicht die beste Idee.1
vonmain
ist implementierungsdefiniert. Die einzige Sprache , definierte Werte sind0
,EXIT_SUCCESS
(oft als definiert0
), undEXIT_FAILURE
.return 1;
Bezeichnet in OpenVMS eine erfolgreiche Beendigung.Auslassen
return 0
Wenn ein C- oder C ++ - Programm das Ende des
main
Compilers erreicht, generiert es automatisch Code, um 0 zurückzugeben, sodass es nicht erforderlich ist,return 0;
explizit am Ende von zu setzenmain
.Hinweis: Wenn ich diesen Vorschlag mache, folgt fast immer eine von zwei Arten von Kommentaren: "Das wusste ich nicht." oder "Das ist ein schlechter Rat!" Mein Grundprinzip ist, dass es sicher und nützlich ist, sich auf das vom Standard explizit unterstützte Compilerverhalten zu verlassen. Für C seit C99; siehe ISO / IEC 9899: 1999, Abschnitt 5.1.2.2.3:
Für C ++ seit dem ersten Standard im Jahr 1998; siehe ISO / IEC 14882: 1998, Abschnitt 3.6.1:
Alle Versionen beider Standards (C99 und C ++ 98) haben seitdem die gleiche Idee beibehalten. Wir verlassen uns auf automatisch generierte Elementfunktionen in C ++, und nur wenige Leute schreiben explizite
return;
Anweisungen am Ende einervoid
Funktion. Gründe gegen das Weglassen scheinen sich auf "es sieht komisch aus" zu beschränken . Wenn Sie wie ich neugierig auf die Gründe für die Änderung des C-Standards sind lesen Sie diese Frage . Beachten Sie auch, dass dies in den frühen neunziger Jahren als "schlampige Praxis" angesehen wurde, da es sich zu dieser Zeit um undefiniertes Verhalten handelte (obwohl es weitgehend unterstützt wurde).Darüber hinaus enthalten die C ++ - Kernrichtlinien mehrere Fälle des Auslassens
return 0;
am Endemain
und keine Instanzen, in denen eine explizite Rückgabe geschrieben wird. Obwohl es in diesem Dokument noch keine spezifische Richtlinie zu diesem speziellen Thema gibt, scheint dies zumindest eine stillschweigende Bestätigung der Praxis zu sein.Also befürworte ich, es wegzulassen; andere sind anderer Meinung (oft vehement!). Wenn Sie auf Code stoßen, der ihn weglässt, wissen Sie auf jeden Fall, dass er vom Standard ausdrücklich unterstützt wird, und Sie wissen, was er bedeutet.
quelle
return 0;
soll. Ich möchte jedoch darauf hinweisen, dass viele Compiler dieser Ära bereits ein implizites implementiert habenreturn 0;
, bevor es war standardisiert.return 0
seit über einem Jahrzehnt keinen Compiler mehr gefunden, der implizite nicht unterstützt . Auch aktuelle Versionen von Microsoft C unterstützen dies . Vielleicht sind Ihre Informationen nicht mehr aktuell?Was zurückgegeben werden soll, hängt davon ab, was Sie mit der ausführbaren Datei tun möchten. Wenn Sie Ihr Programm beispielsweise mit einer Befehlszeilen-Shell verwenden, müssen Sie 0 für einen Erfolg und eine Nicht-Null für einen Fehler zurückgeben. Dann könnten Sie das Programm in Shells mit bedingter Verarbeitung verwenden, abhängig vom Ergebnis Ihres Codes. Sie können auch einen beliebigen Wert ungleich Null gemäß Ihrer Interpretation zuweisen. Beispielsweise können bei kritischen Fehlern verschiedene Programm-Exit-Punkte ein Programm mit unterschiedlichen Exit-Werten beenden. Dies steht der aufrufenden Shell zur Verfügung, die entscheiden kann, was zu tun ist, indem sie den zurückgegebenen Wert überprüft. Wenn der Code nicht für die Verwendung mit Shells vorgesehen ist und der zurückgegebene Wert niemanden stört, wird er möglicherweise weggelassen. Ich persönlich benutze die Unterschrift
int main (void) { .. return 0; .. }
quelle
main
kompatibel istint
. Daher ist die Rücksendungint
kein Problem. Es sind zwar andere Rückgabetypen zulässig, aber in diesem Fall wird die Umgebungsvariable mit dem Rückgabewert nicht angegeben. Wenn ein Programmierer dies jedochreturn 0;
in Bash tut , kann er zum Erstellen von Zweigen verwendet werden.Wenn Sie wirklich Probleme mit der Effizienz der Rückgabe einer Ganzzahl aus einem Prozess haben, sollten Sie es wahrscheinlich vermeiden, diesen Prozess so oft aufzurufen, dass dieser Rückgabewert zu einem Problem wird.
Wenn Sie dies tun (einen Prozess so oft aufrufen), sollten Sie eine Möglichkeit finden, Ihre Logik direkt im Aufrufer oder in einer DLL-Datei abzulegen, ohne jedem Aufruf einen bestimmten Prozess zuzuweisen. Die mehrfachen Prozesszuordnungen bringen Ihnen in diesem Fall das relevante Effizienzproblem.
Wenn Sie nur wissen möchten, ob die Rückgabe von 0 mehr oder weniger effizient ist als die Rückgabe von 1, kann dies in einigen Fällen vom Compiler abhängen, jedoch generisch, vorausgesetzt, sie werden aus derselben Quelle gelesen (lokal, Feld, Konstante, eingebettet) im Code, Funktionsergebnis usw.) erfordert es genau die gleiche Anzahl von Taktzyklen.
quelle
Hier ist eine kleine Demonstration der Verwendung von Rückkehrcodes ...
Wenn Sie die verschiedenen Tools verwenden, die das Linux-Terminal bereitstellt, können Sie den Rückkehrcode beispielsweise zur Fehlerbehandlung verwenden, nachdem der Vorgang abgeschlossen wurde. Stellen Sie sich vor, dass die folgende Textdatei myfile vorhanden ist:
Wenn Sie den Befehl grep ausführen, wird ein Prozess erstellt. Sobald es fertig ist (und nicht kaputt gegangen ist), gibt es einen Code zwischen 0 und 255 zurück. Zum Beispiel:
Wenn Sie tun
Sie erhalten eine 0. Warum? Weil grep eine Übereinstimmung gefunden und einen Exit-Code 0 zurückgegeben hat, was der übliche Wert für das erfolgreiche Beenden ist. Lassen Sie es uns noch einmal überprüfen, aber mit etwas, das nicht in unserer Textdatei enthalten ist und daher keine Übereinstimmung gefunden wird:
Da grep das Token "foo" nicht mit dem Inhalt unserer Datei abgleichen konnte, ist der Rückkehrcode 1 (dies ist der übliche Fall, wenn ein Fehler auftritt, aber wie oben angegeben, haben Sie viele Werte zur Auswahl).
Nun sollte das folgende Bash-Skript (geben Sie es einfach in ein Linux-Terminal ein), obwohl es sehr einfach ist, eine Vorstellung von der Fehlerbehandlung geben:
Nach der zweiten Zeile wird nichts auf dem Terminal gedruckt, da "foo" grep auf 1 zurückgesetzt hat und wir prüfen, ob der Rückgabecode von grep gleich 0 war. Die zweite bedingte Anweisung gibt ihre Nachricht in der letzten Zeile wieder, da sie aufgrund von CHECK wahr ist == 1.
Wie Sie sehen können, wenn Sie diesen und jenen Prozess aufrufen, ist es manchmal wichtig zu sehen, was zurückgegeben wurde (anhand des Rückgabewerts von main ()).
quelle
if grep foo myfile; then echo 'Match found'; else echo 'No match was found'; fi
- den Rückgabestatus direkt testen. Wenn Sie den Status erfassen möchten (für die Berichterstellung usw.), verwenden Sie eine Zuordnung. Sie könnten verwendenif grep foo myfile; CHECK=$?; [ "$CHECK" = 0 ]; then echo 'Match found'; else echo 'No match was found'; fi
oder Sie könnten drei Zeilen verwenden. Sie können auch Optionen verwenden-s
und-q
aufgrep
die Spiele oder Routine Fehlermeldungen erscheinen zu verhindern. Dies ist jedoch Shell Minutiae - der entscheidende Punkt, dass der Exit-Status nützlich sein kann - ist in Ordnung.Diese Worte "(am effizientesten)" ändern nichts an der Frage. Wenn Sie sich nicht in einer freistehenden Umgebung befinden, gibt es einen allgemein korrekten Weg, dies zu deklarieren
main()
, und das ist die Rückgabe von int.Es ist nicht das, was sollte
main()
zurückkehren, es ist , was tutmain()
Rückkehr.main()
ist natürlich eine Funktion, die jemand anderes aufruft. Sie haben keine Kontrolle über den aufrufenden Codemain()
. Daher müssen Siemain()
eine typkorrekte Signatur angeben, die mit dem Anrufer übereinstimmt. Sie haben einfach keine Wahl. Sie müssen sich nicht fragen, was mehr oder weniger effizient ist, was besser oder schlechter ist oder so etwas, denn die Antwort ist für Sie nach den Standards C und C + bereits perfekt definiert. Folge ihnen einfach.0 für Erfolg, ungleich Null für Misserfolg. Auch hier müssen Sie nichts auswählen (oder auswählen): Es wird durch die Schnittstelle definiert, an die Sie sich anpassen sollen.
quelle