Warum benutzen wir nicht (void) in main?
Menschen nutzen void main() /*empty parens ()*/
Ich wurde gelehrt zu schreiben void main(void)
Irgendwelche Ideen, was der Unterschied ist?
InformationsquelleAutor der Frage Fahad Uddin | 2010-07-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, was die standards sind heute aber in der traditionellen ANSI-C, mit leeren Klammern gibt an, dass die Funktion alle Anzahl von Argumenten. Deklarieren einer
void
parameter auf der anderen Seite zeigt an, dass die Funktion dauert nur null Argumente. In diesem Fall (und vielen anderen), es spielt wirklich keine Rolle, zu viel.Wenn Sie wollen, konsequent zu sein, aber es ist wahrscheinlich am besten zu definieren, die
void
parameter. Natürlich, diemain
Funktion kann auch definiert werden alsint main(int argc, const char* argv[])
- und das ist durchaus gültig, aber oft unnötig, wenn Sie kümmern sich nicht um Argumente.InformationsquelleAutor der Antwort Noldorin
Aus der C99-standard:
Als main definiert ist, die ohne Parameter wird argc und argv immer noch auf dem Stapel?
InformationsquelleAutor der Antwort Tim Schaeffer
Diese Prototypen von main() sind nicht-standard.
Präzision auf diese Frage finden Sie auf der comp.lang.c faq : http://c-faq.com/decl/main.html
BEARBEITEN: geändert "falsch" zu "nicht-standard" als norm ermöglicht die Implementierung festgelegt Prototypen.
InformationsquelleAutor der Antwort Gery
Es ist kein Unterschied, aber in der Regel main zurückgeben soll. int. Einige Compiler geben eine Warnung aus (zumindest die GNU-compiler - gcc):
Wie erwähnt, der Prototyp der main ist (laut standard):
int main(int argc, const char* argv[])
InformationsquelleAutor der Antwort INS
main
ist eine Funktion, die andere Funktion. Fast. Wie auch immer, wird eine Funktion, die aufgerufen wird, ein anderer code (start-code). In der Regel (fast immer)int main()
ist richtig, aber in der Tat, was ist die wahre richtige ist, hängt von der Plattform, die Sie arbeiten. Da, wie gesagt, die main-Funktion aufgerufen werden könnte, indem ein startup-code, der pass in keine Argumente, und das erwarten keinen return Wert in ein spezielles register (so dassvoid main(void)
richtig ist).Den
int main()
korrekt ist, da normalerweise start-up-code erwartet einen Rückgabewert, und übergeben Sie zwei Argumente. Sagenint main(void)
du sagst main keine Argumentation, dass ist falsch in den meisten Fällen. Mit()
Sie sagen, es gibt Argumente (eins, zwei, drei, Sie don ' T care), aber Sie sind nicht interessiert in Ihnen, so dass Sie nicht daran interessiert sind, sagen, was Sie sind und welchen Typ Sie sind.Wie ich sehen kann, in den codes, die am häufigsten verwendeten Prototyp für den "normalen" Umgebungen (kein embedded-Gerät oder anderen "fremden" Umgebungen, in denen die wichtigsten genannt werden können, anders) ist
int main()
wenn Sie ignorieren die übergebenenint argc, char **argv
Argumente. (GCC beschweren, da sind wir mit einer version für gcc-geeignet für die Umgebung; testen Sie es mit cross-GCC-version für eine von dem Umfeld, in dem startup code nicht weitergeben, Argumente und erwarten, dass kein Rückgabewert)Bearbeiten
Nur, um freundlich zu skeptischen Personen; auf die eine Umgebung, wo die main-Funktion aufgerufen wird, wird mit zwei Argumenten, die folgenden
sagt kein Fehler für A, während B sagt
too many arguments to function ‘func2’
zusammengestellt mitgcc -std=c99 -pedantic
. Ändernint main(void)
inint main()
keinen Unterschied macht, und keine Warnungen.Auf andere evironments (ich kann das nicht machen praktische tests nun),
void main(void)
ist ok, während es in diesem Fall löst eine Warnung aus. Die Warnung ist nicht, weil der standard allein, aber nur, da in der Umgebung im Einsatz war der Prototyp für main nicht passt. Standard scheint zu zulassen, dass eine andere "Konfiguration" für main.In dem OP-Fall, considerering die "normale" Umgebung (O. S. wie GNU/Linux z.B.), wo zwei Argumente übergeben werden, die wichtigsten, und ein Rückgabewert erwartet wird, die
int main()
vorzuziehen ist (Argumente werden auf den stack geschoben, die durch den startup-code, ob Sie sagenint main(void)
oder nicht, soint main()
für mich mehr Sinn machen)Bearbeiten
Noch ein Hinweis, immer für die skeptische person. Wie bereits bewiesen, B) löst einen Fehler aus, da ich gesagt habe, dass es
int func2(void)
aber ich nenne Sie übergeben ein argument. Dann lassen Sie uns nehmen wir an, wir kompilieren können, den startup-code und link, wie jeder andere code. Irgendwo, es werden die wichtigsten, in einer Weise, wieWenn wir
int main(void)
der compiler Stoppt, geben einen Fehler, da die startup-code (in diesem Umfeld) versucht zu rufen wesentlichen mit zwei Argumenten. Wenn wirint main()
passiert nichts und der code kompiliert wird, richtig.So,
int main()
ist superior zuint main(void)
(in der Umgebung, wo wir erwarten zwei Argumente zu main möglich)Bearbeiten
Eher der Aufruf ist wie
auf vielen Systemen, aber dies ändert nicht die Rede.
endgültige Bearbeitung
Hatte jemand feststellen, dass, wenn Gebäude ein Kommandozeilen-tool (d.h. auf Systemen, auf denen
int argc, char **
Sinn macht) mitint main(void)
die gewählten compiler - /linker-links ein startup-code, in dem diemain
ohne argument aufgerufen (was auch immer die Aufrufkonventionen sind), und stattdessen, wenn Gebäude mitint main(int argc, char **argv)
den startup-code ist anders und in der Tat ruft diemain
mit diesen zwei Argumenten (auch wenn diemain
sich nicht mit Ihnen)?InformationsquelleAutor der Antwort ShinTakezou