2013-08-26 10 views
20

Ich habe C-Programmierung in einer autodidaktischen Weise seit einigen Wochen gelernt, und es gibt einige Fragen, die ich bezüglich der main() Funktion habe.main() Funktion in C

  1. Alle Funktionen müssen in ihrem Funktionsprototyp und später in ihrer Definition deklariert werden. Warum müssen wir die main() Funktion nicht zuerst in einem Prototyp deklarieren?

  2. Warum müssen wir int main() anstelle von void main() verwenden?

  3. Was bewirkt 0 genau in der main() Funktion? Was würde passieren, wenn ich zum Beispiel ein Programm schreibe, das die main()-Funktion mit return 1; beendet?

+6

'main()' sogar eine eigene [Wikipedia] hat (http://en.wikipedia.org/wiki/Main_function) –

+7

1) ist falsch - Prototyp nicht ist "a must" – aragaer

+2

@ user2718426 Kopf hoch, 'um diese Teile, möchten wir jede Frage auf nur eine Frage zu einer Zeit halten. Ihr Beitrag klingt also wie drei Fragen. Obwohl Sie über das zweite schon viel schreiben würden, wie http://stackoverflow.com/questions/9356510/int-main-vs-void-main-in-c –

Antwort

14
  1. Sie benötigen entweder eine Definition oder ein Prototyp, um eine Funktion ordnungsgemäß aufzurufen, aber main darf niemals von einer anderen Funktion aufgerufen werden, so dass nicht deklariert werden muss.
  2. Weil der C-Standard so sagt. Betriebssysteme übergeben den Rückgabewert an das aufrufende Programm (normalerweise die Shell). Einige Compiler akzeptieren void main, aber dies ist eine Nicht-Standard-Erweiterung (es bedeutet normalerweise "immer Null an das Betriebssystem zurückgeben").
  3. Per Konvention signalisiert ein Rückgabewert ungleich Null, dass ein Fehler aufgetreten ist. Shell-Skripte und andere Programme können dies verwenden, um herauszufinden, ob Ihr Programm erfolgreich beendet wurde.
0

1) es ist falsch, Sie können nur die Definition einer Funktion erstellen.

2) können wir wissen, ob die Funktion main() korrekt

3 beenden) die gleiche, außer dass in der Shell wird es 1 writed werden anstelle von 0

15

1) Alle Funktionen in ihrer Funktionsprototyp deklariert werden müssen, und später, in ihrer Definition. Warum müssen wir die Funktion main() nicht zuerst in einem Prototyp deklarieren?

Nicht wahr. Einfaches Beispiel:

void foo(){} //definition 

int main() 
{ 
    foo(); 
    return 0; 
} 

Nur wenn eine Funktion aufgerufen wird, aber die Definition noch nicht angezeigt wird, ist eine Deklaration erforderlich. Das wird main nie passieren, da es das Starup des Programms ist.


2) Warum haben wir int main() anstelle von void main() zu benutzen?

Weil der Standard so sagt. (Um genauer zu sein, trifft dies auf eine gehostete Umgebung zu, was normalerweise der Fall ist)

C99 5.1.2.2.1 Programmstart

Die beim Programmstart aufgerufene Funktion heißt main. Die Implementierung deklariert keinen Prototyp für diese Funktion. Sie gilt mit dem Rückgabetyp int und ohne Parameter definiert werden:

int main(void) { /* ... */ } 

oder mit zwei Parametern (hier bezeichnet als argc und argv, obwohl alle Namen verwendet werden, da sie auf die lokale sind Funktion, in der sie deklariert sind):

int main(int argc, char *argv[]) { /* ... */ } 

oder gleichwertig; oder in einer anderen implementierungsdefinierten Weise.


3) Was bedeutet return 0 genau in der Funktion main() tun? Was würde passieren, wenn ich ein Programm schreiben würde, das die Funktion main() mit return 1 beendet?

Der Rückgabewert gibt das Ergebnis des Programms an. Normalerweise zeigt 0 den Erfolg an, während andere Werte auf verschiedene Arten von Fehlern hinweisen.

1

1) Nicht unbedingt; Eine Definition dient auch als Deklaration. Zweitens gibt es nur wenige gültige Signaturen für main, und normalerweise rufen Sie main nicht in Ihrem Code auf, es sei denn, Sie schreiben einen Eintrag für die IOCCC.

2) Kurze Antwort: weil die Sprachdefinition so sagt. Längere Antwort: So zeigt Ihr Programm Erfolg oder Misserfolg in der Host-Umgebung an. Eine einzelne Implementierung kann zusätzliche Signaturen für main unterstützen, muss diese zusätzlichen Signaturen jedoch dokumentieren. Wenn Ihre Compiler-Dokumentation void main() nicht als rechtliche Signatur auflistet, sollten Sie sie nicht verwenden.

3) Per Konvention (mindestens auf * nix-Systemen, bei denen C zuerst verwendet wurde) zeigt ein Status von 0 Erfolg an, und ein Status ungleich Null zeigt an ... etwas anderes als Erfolg. Welcher Wert genau welchem ​​Status entspricht, hängt von der Implementierung ab.

0

Funktionen müssen nicht unbedingt zuerst als Prototyp deklariert werden. Eine solche Deklaration wird nur benötigt, wenn wir eine Funktion verwenden müssen, bevor sie definiert wird.

Haupt hat Int per Definition.

Die Bedeutung des von main zurückgegebenen Werts ist konventionell. Die Konvention, die allgemein akzeptiert wird, ist, dass 0 als Erfolg betrachtet wird und nicht als eine Art Fehler.

0

1.Die Funktion main() wird implizit von der C-Bibliothek aufgerufen, indem das integrierte Schlüsselwort 'main' erkannt wird. Wir müssen also keinen Prototyp für die Hauptfunktion deklarieren.

2.Das bin ich nicht sicher, aber ich denke, es hängt von der Art des verwendeten Editors ab. In Turbo C wird void main() akzeptiert, während in dev-cpp main() einen Wert zurückgeben sollte.

3.return 0 beendet das Programm einfach mit dem Exit-Status 0, dh der Rückgabewert bestimmt den Exit-Status des Haupt-Threads.

2

Sie können nicht den Rückgabetyp von Haupt wählen, weil Sie nicht den Code geschrieben haben, der Haupt aufruft. Der code calling main existierte bereits, bevor Sie überhaupt daran gedacht haben, C zu lernen. Er wurde von den Leuten geschrieben, die den C-Laufzeit-Startcode bereitstellen, der normalerweise automatisch mit Ihrer ausführbaren Datei verbunden ist, ohne dass Sie es wissen. Dieser Code befindet sich oft in einer Datei namens crt0.o (erstellt von crt0.c oder sogar assembler in crt0.s). Es wird erwartet, dass ein Rückgabewert verwendet wird, der Erfolg (0) oder Fehler (ungleich Null) angibt, sowie möglicherweise andere Informationen, z. B. ob der Code aufgrund eines Signals beendet wurde und wenn ja, welcher. Dies sind Teile der Unix-Geschichte, die ich hier nicht wiederholen werde :-)

0

Einfach ausgedrückt das Wesentliche für alle Ihre Fragen ist Traditionen und Konformität. Toolchains, Betriebssysteme, etc. weiß, dass Art und Weise, dass diese Prozedur main() aufgerufen, muss zuerst werden vom Benutzer Coderaum (Programm) ...

Jetzt speziell ruft: 1) Aufgrund der Konformität als ich sagte. Sie müssen nicht deklarieren, weil Toolchains und Betriebssysteme bereits von main wissen. Es gibt auch andere Konformitätsfunktionen wie exit().

2) Wenn die Hauptsache einige Zeit zurückkommt, kann das Betriebssystem das Ergebnis zurück haben. In der Regel bedeutet Null einen Fehler. Wenn U Skripte oder andere Programme verwendet, die Ihr Programm aufrufen, z. main() -Funktion können Sie überprüfen, ob es erfolgreich war.

3) Zurückgeben etwas anderes als Null bedeutet Fehler. Aber tatsächlich können Sie diesen Wert so interpretieren, wie Sie es wollen. Aber wie gesagt, OS kann das Ergebnis haben.

Zusätzliche Informationen: main() ist eigentlich nicht die erste Funktion (Sie haben geschrieben), die aufgerufen wird, wenn Sie das Programm starten. ABER tatsächlich Betriebssysteme und Werkzeugketten erleichtern andere Anrufe vor Ihrem Haupt, um Umgebung einzurichten, die Initialisierung oder was auch immer zu tun. Aber Sie wissen es nicht direkt, wenn Sie Ihren Code schreiben, und Sie müssen sich damit nicht befassen und darüber nachdenken. In eingebetteten Systemen gibt es normalerweise einige Funktionen auf sehr niedriger Ebene, die aufgerufen werden, um den CPU-Haupttakt, Unterbrechungen, Stapel usw. einzurichten. Einige der Werkzeugketten wie IAR können tatsächlich ermöglichen, dass Sie Ihren eigenen Code ausführen, bevor main aufgerufen wird.

Hoffnung half dies :)

Verwandte Themen