2 Fragen zur C++-Syntax
-
Hallo Community
Ich habe zuhause 2 Programmierbücher und bis jetzt auch eigentlich alles verstanden. Aber trotzdem gibt es zwei Sachen, die ich partout nicht verstehe.
Diese betreffen die Beispielprogramme in den Büchern.
Das ist ein Bsp. aus dem einten Buch:int main() {//Die Anweisungen return 0; }Und eines aus dem anderen Buch:
int main(int nNumberofArgs, char* pszArgs[]) { //Die Anweisungen }Jetzt meine Fragen:
1.Wieso ist die main-Funktion so verschieden?
2.Ist diesesreturn 0;wirklich nötig?
Und bitte probiert, die Sachlage in einfachen
Worten zu schildern, ich bin (noch) nicht so gut in C++
-
Meiner Meinung nach beides Falsch.
int main(int argc, char* argv[]) { //bla return 0; }return in der main-methode setzt den exit-code.
So könnte man auch exit(0); schreiben (aber lasse das).Und die Parameter solltest du auch berücksichtigen...
-
Hallo,
main ist die einzige Funktion in C++, die einen impliziten Rückgabewert hat. Insofern kannst du in dieser Funktion das return 0 weglassen. Musst du aber natürlich nicht.Der C++ Standard definitiert verschiedene Signaturen für die main-Funktion. Die Einfachste ist int main(). Wenn dein Programm allerdings Parameter entgegen nehmen soll (z.B. von der Kommandozeile), dann brauchst du eine andere Variante. Die beiden Parameter in int main(int nNumberofArgs, char* pszArgs[]) (typischerweise: int main(int argc, char** argv)) sind genau hierfür gedacht. Der erste Parameter enthält die Anzahl der Parameter, die an dein Programm übergeben wurden. Der zweite die eigentlichen Parameter in der Form eines Arrays von nullterminierten Char-Arrays (C-Strings).
-
gcoder|unlogged schrieb:
Meiner Meinung nach beides Falsch.
int main(int argc, char* argv[]) { //bla return 0; }return in der main-methode setzt den exit-code.
So könnte man auch exit(0); schreiben (aber lasse das).Also soll ich das mit return 0 gleich ganz weglassen, richtig?
gcoder|unlogged schrieb:
Und die Parameter solltest du auch berücksichtigen...
Ich verstehe zwar, was mit Parametern gemeint ist, aber welche meinst du jetzt?
Diese in den Klammern?:int main (int argc, char* argv[])
-
wenn du bei Windows in die Kommandozeile (cmd.exe) gehst oder bei Unix/Linux in die Shell, kannst du dort ein Programm mit zusätzlichen Parametern starten.
Also jetzt mal als Beispiel (unter Windows):shutdown -s -t 00dabei ist shutdown ein Programm bzw. ein Windowsinterner Befehl (eigentlich auch egal), -s ist der 1. Parameter, -t der 2. und 00 dem zu Folge der 3.
der Parameter argc bei int main(int argc, char** argv) ist immer die Anzahl der Parameter + 1, da der Programmname selbst auch als Parameter gewertet wird.
das bedeutet, dass sich in argv[0] der Programmname befindet, in dem Sinne shutdown.
und noch was: auch wenn man das return 0; bei der main-Funktion weglassen kann, sollte man es der Ordnung halber trotzdem verwenden.
Denn
1.: Wenn in deinem Programm ein Fehler passiert, kannst du das dem System über den Rückgabewert der main-Funktion mitteilen und den Wert evtl. über ein Shellskript bzw. über eine Stapelverarbeitungsdatei (Batch; *.bat) abfangen und verarbeiten.
2.: Zudem sieht es sauberer aus, wenn man in einer als int definierten Funktion auch einen int zurückgibt, sonst könntest du ja auch void verwenden.MfG DrakoXP
-
IIRC ist der 0. Wert der Aufruf des Programms, nicht der Name (relevant, wenn zB über einen Symlink aufgerufen wird). Das ist aber wahrscheinlich wieder Implementierungsabhängig.
Ach ja, um vielleicht etwas Verwirrung zu nehmen:
In dem übersetzten Programm existieren die Namen von Funktionsparametern nicht mehr! Die Signaturint main (int, char**)ist somit dieselbe wie die diversen Varianten die hier schon genannt wurden, sie sind alle gleichwertig.
Die letzte Variante, die dir noch begegnen kann ist die C-Form von int main (), nämlich int main (void). Bedeutet aber genau das Selbe.
DrakoXP schrieb:
und noch was: auch wenn man das return 0; bei der main-Funktion weglassen kann, sollte man es der Ordnung halber trotzdem verwenden.
Denn
1.: Wenn in deinem Programm ein Fehler passiert, kannst du das dem System über den Rückgabewert der main-Funktion mitteilen und den Wert evtl. über ein Shellskript bzw. über eine Stapelverarbeitungsdatei (Batch; *.bat) abfangen und verarbeiten.
2.: Zudem sieht es sauberer aus, wenn man in einer als int definierten Funktion auch einen int zurückgibt, sonst könntest du ja auch void verwenden.Über das Zweite lässt sich streiten, zum Ersten: Das kannst du auch ohne return 0 am Ende. Den Fehlercode kannst du ja schon früher zurückgeben, nämlich dann, wenn der Fehler auftritt. Läuft das Programm durch, dann bekommst du automatisch eine 0 als Rückgabewert, so wie es sein soll.