Orffi Geschrieben 22. März 2002 Geschrieben 22. März 2002 Hallo zusammen! Ich würde ganz gerne ein paar Worte zur main-Funktion verlieren. Ich habe in diesem Forum schon öfter gesehen, daß "void main ()" geschrieben wurde. Das ist falsch, da in diesem Forum über ANSI-C und ISO-C++ gesprochen (oder besser geschrieben) wird. Beide Standards sagen, daß main ein int zurückliefern muß. Das kürzeste C++-Programm ist also int main () {} Dieses Programm liefert als einziges den Rückgabewert 0 an den Aufrufer (z.B. Betriebssystem) zurück. return 0; Darf in C++ in der main-Funktion weggelassen werden, es wird vom Compiler ergänzt. Die Argumentation, void main () ist nicht falsch, da der Compiler keine Fehlermeldung auswirft, zieht nicht, da noch lange nicht alles, was der Compiler ohne Fehler übersetzt richtig ist. Es mag ja sogar Systeme geben, die nur void main () anbieten, aber diese Systeme sind nicht standardkonform. Dieser Tatsache sollte man immer im Hinterkopf behalten. Übrigens ist die Annahme falsch, void main () würde funktionieren, weil void besagt, ein unbekannter Rückgabewert würde zurückgeliefert. Bei void wird kein Rückgabewert zurückgeliefert! Ein void-Funktion kann gar keinen Wert zurückliefern. Es liegt nur am Compiler, der über diesen Fehler hinwegsieht, daß void main () funktioniert. Es ist wichtig zu wissen, was Standard ist und was nicht! Also bitte, bitte nur noch int main (). Jan Zitieren
ChrisP Geschrieben 22. März 2002 Geschrieben 22. März 2002 Wer das void so liebt, kann ja auch int main(void) { } schreiben. Aber was Orffi sagt, is schon richtig! Zitieren
gajUli Geschrieben 22. März 2002 Geschrieben 22. März 2002 Seh ich genauso wie Orffi. Mich faellt es zwar jedesmal an, wenn ich void main() sehe, aber dagegen anzuschreiben, ist etwas arg strapazioes, denn viele haben nicht einmal kapiert, dass es ueberhaupt sowas wie einen Standard gibt und was er zu bedeuten hat. Aber vielleicht beginnt ja allmaehlich mal eine Sensibilisierung fuer Sprachstandards. Ich haette jedenfalls nichts dagegen. Zitieren
EvilInside Geschrieben 22. März 2002 Geschrieben 22. März 2002 Ich pflichte Orffi absolut bei. Ob es was hilft muß man abwarten - ich sehe das doch eher pessimistisch Zitieren
hades Geschrieben 22. März 2002 Geschrieben 22. März 2002 Original geschrieben von ChrisP Wer das void so liebt, kann ja auch int main(void) { } ooch noe... noch so eine Verunstaltung;) int main (int argc, char *argv[]) { return 0; } passt eher... Zitieren
Jaipur Geschrieben 22. März 2002 Geschrieben 22. März 2002 Hi, Standard hin oder her, wie denn jetzt richtig? int main() oder int main( int argc, char *argv[]) Zitieren
Orffi Geschrieben 22. März 2002 Autor Geschrieben 22. März 2002 Beides ist richtig und entspricht dem Standard. Wobei ich zu "Standard hin oder her, wie denn jetzt richtig?" bemerken möchte: Richtig ist, was Standard ist! Oder anders ausgedrückt: Der Standard bestimmt, was richtig ist. Bei int main () werden die Kommandozeilenparameter nicht berücksichtigt. Bei int main ( int argc, char *argv[] ) kann das Programm auf die übergebenen Parameter zugreifen. Wenn ich ein Programm schreiben wollte, daß ein Dateiinhalt in eine andere Datei kopiert (copy datei1 datei2). Dann müßte ich meine main-Funktion so schreiben: int main ( int argc, char *argv[] ) (Damit ich auf die Dateinamen, die beim Programmaufruf übergeben werden, zugreifen kann) HTH Jan Zitieren
Crush Geschrieben 23. März 2002 Geschrieben 23. März 2002 Orffi, ich gebe Dir Recht - ich hatte mir ja nicht gedacht, daß Dich das so beschäftigen würde ... Der Rückgabe int vom Main ist doch nur um einen Fehler rückzumelden. Ist das einem egal, ob ein Fehler ans DOS-Fenster zurückgeht, spielt es keine Rolle, ob man nun nach dem Standard geht oder nicht. Ein Programm wird halt mit main gestartet und theoretisch könnte ich auch die Parameter variieren, wenn ich das für notwendig halte. z.B. wäre es möglich einen void* auf irgendwelche Strukturen zu überreichen. Der Compiler beschwert sich nicht und das Programm wird trotzdem ordnungsgemäß gestartet. Ich könnte wenn ich lustig bin die main so aussehen lassen: void main(double v[10],void*x=0,char *y=0) { code ... code ... code } Warum auch nicht. es wird übersetzt, läßt sich linken, starten und gibt mir halt meist eine Fehler-Nr. zurück wegen void, aber wassolls, wenn das Programm seine Aufgabe erfüllt ... oder vielleicht gar nicht vorgesehen ist, daß Programm überhaupt zu verlassen! Lediglich die Parameter sollten, wenn sie so exotisch sind wenigstens beim Aufruf initialisiert werden. Das ist jedoch bei normalem Aufruf nicht der Fall, sondern ein Programm müßte dieses in den Speicher laden und dann mit den Parametern aufrufen. Nur, weil es nicht Standard ist, heißt es nicht, daß es nicht geht - Glaubt Ihr alle, daß Ihr immer 100% Standard programmiert? Ich bezweifel das. Genau solche unverhofften Dinge, an die man normalerweise nicht zu denken wagt ermöglichen manchmal nahezu unmögliche Dinge, die nicht sein dürften. Die generische Meta-Programmierung ist z.B. einer der exotischsten Nebenprodukte von C++, was im Sprachstandard nicht einmal erahnt wurde. Da sieht die Sache mit main() noch wie ein Witz dagegen aus. Grundsätzlich aber muß ich Orffi Recht geben - jedenfalls nach Stroutrup Frage: "Can I write "void main()"?" Ich habe aber auch gesagt, daß ich da nicht drauf geachtet habe, weil ich den Header von einem fremden DOS-Programm übernommen und da nur meinen Code in die Klammer kopiert habe. Kommt nie wieder vor. Wenn Du allerdings mal nach >void main< suchst, wirst Du tausende von Sources finden, die genau das beinhalten. Jetzt ist die Frage, wer setzt den Standard? Der Erfinder oder die Community? Sogar SS sagte einmal, daß die private Vererbung eigentlich ein Designfehler war. Und trotzdem ist es immer noch vorhanden und wird verwendet. Zitieren
gajUli Geschrieben 23. März 2002 Geschrieben 23. März 2002 Original geschrieben von Crush Nur, weil es nicht Standard ist, heißt es nicht, daß es nicht geht - Glaubt Ihr alle, daß Ihr immer 100% Standard programmiert? Fuer den Satz waerst Du auf jeder C oder C++ Newsgroup in einem Flamewar zum Deppen der Gruppe abgestiegen. Wenn Du es nicht glaubst, poste das mal in de.comp.lang.c. (Aber petz bitte nicht, dass ich das gesagt haette.) Und ja, ich programmiere in C/C++ niemals etwas anderes als Standard, jedenfalls nicht wissentlich, und wenn doch, dann ist es mir peinlich. Geht auch nicht anders, wenn man zuhause gcc und Metrowerks auf Apple faehrt und in der Bildungsanstalt Borland, VS und gcc auf Windoof und Linux. Uebrigens, was heisst "dass es geht"? Das kann man doch gar nicht ueberschauen; Use-cases fuer undefined behaviour sind blanker Logikunsinn.... Zitieren
Crush Geschrieben 23. März 2002 Geschrieben 23. März 2002 Mir ist es jedenfalls nicht peinlich, daß mir da mal so was passiert ist (ich war halt zu faul nochmal nach dem Standard zu sehen) und ich fühle mich ja schon schuldig =8-( . Ich hab ja auch geschrieben, daß ich in Zukunft bei main besser aufpassen werde. "Depp der Gruppe" hört sich fast genauso gut an wie "Ego-Shooter-Server-Admin". Zitieren
gajUli Geschrieben 23. März 2002 Geschrieben 23. März 2002 Naja, keine Sorge, hier bist Du doch nicht der Gruppenkasper. :OD Zitieren
Orffi Geschrieben 24. März 2002 Autor Geschrieben 24. März 2002 Hier die Antwort auf die Frage von Crush: "Jetzt ist die Frage, wer setzt den Standard? Der Erfinder oder die Community?" Weder Der Erfinder, noch die Community (wer immer das sein soll...) setzt den Standard. Den Standard hat ISO (International Organization for Standardization) gesetzt. Natürlich ist das jetzt eine langweilige Antwort, aber leider die einzig richtige... Jan Zitieren
Crush Geschrieben 24. März 2002 Geschrieben 24. März 2002 Im Endeffekt sitzt da aber auch wieder nur eine kleine Gruppe dahinter, die sich Experten nennt und vielleicht von der Sache selber weniger wissen, weil sie gar nicht praktisch oder gar täglich damit umgehen müssen. Da sind vielleicht 2-3 Mathematiker, 2 Philosophen, Psychologen und ein paar wenige Programmierer bestimmt immer zusammengewürfelt und die überlegen dann, ob die Regelung ihren Anforderungen des Fachbereichs entspricht. Laß bei den Programmierern dann aber keinen dabei sein, der eigentlich mit was ganz anderem arbeitet ... dann könnte auch vieles in die falsche Richtung gelenkt werden. Wer bestimmt eigentlich wer in diese ISO-Ausschüsse hineingenommen wird und wie wird abgestimmt? Unter Ausschluß der Öffentlichkeit, der Community und der Erfinder!?!? Bei Netzwerkprotokollen (und davon gab es irre viele) hat man von allen ehemaligen Standards alles über Bord geworfen und nur das ISO-OSI-Referenzmodell hat bis heute überlebt. Dies ist ein Beispiel, daß die ISO auch mal regelrecht versagen kann. An C# hat man der Programmier-Gemeinde wesentlich mehr mitarbeiten und alle Vorschläge und Änderungen in M$-Foren ausdiskutieren lassen und erst dann hat man entschieden, ob ein Vorschlag in die Syntax reingenommen wird oder nicht - oder ob eigene Vorschläge über Bord geworfen wurden. Wenigstens die main() hat die ISO wohl standardisiert - aber offensichtlich nicht gut genug, wenn die Compiler auch anderes fressen. (mußte ich ja sagen, weil ich sonst mal wieder komplett OT wäre) Zitieren
gajUli Geschrieben 24. März 2002 Geschrieben 24. März 2002 Crush, es ist doch ganz egal, wer den Standard festgelegt hat. Es ist sogar egal, ob die, die den Standard festgelegt haben, Fachleute oder Idioten waren. Das ist so wie bei einem Skipper. Es gibt hundert verschiedene Arten, ein Boot gut zu fuehren, aber wichtig ist nur, sich fuer eine dieser Arten zu entscheiden und diese dann hundertprozentig durchzuziehen. Es gibt einen Standard, und das ist das einzige was zaehlt. Man kann ihn einhalten oder nicht, und fuer beides kann es gute Gruende geben. Wenn Dein Compiler Code frisst, der gegen den Standard verstoesst, bedeutet das nur eins: Dein Compiler compiliert nach den Regeln von IRGENDWAS, aber dieses IRGENDWAS ist nicht c oder c++, jedenfalls nicht hundertprozentig und ist damit ueberhaupt kein c- oder c++-Compiler, sondern irgendein Derivat, das entweder undefined behaviour ( = alles kann passieren) produziert oder nicht, wobei es muessig ist, darueber zu sinnieren, ob ein Programm, das in einem einzigen Teil undefined behaviour erzeugt insgesamt oder nur teilweise konzeptioneller Schrott ist. Alles andere sind Nebelschwaden. Rein persoenlich mag ich keine Instrumente, die, wenn ich einen b-moll Akkord anschlage, entweder einen b-moll Akkord erklingen lassen oder vielleicht auch einen A-Dur Accord, nein, wenn ich einen b-moll Akkord anschlage, dann muss der auch immer ertoenen, weil sonst mein ganzes Orchester durcheinander kommt. Vielleicht gibt es Leute, die es in Kauf nehmen, wenn ihr Klavier mal b-moll und mal A-Dur spielt, obwohl sie die gleichen Tasten druecken, aber ganz sicher sind das keine guten Musiker. Arnold Schoenberg war ein genialer Musiker. Schoenberg erfand die Zwoelftonmusik, sozusagen einen eigenen Standard. Das kann man auch als Programmierer machen. Schoenberg war nicht nur genial, er kannte auch _alle_ Noten. Ein Programmierer kann heutzutage aber nicht mehr alle Varianten seines Klaviers kennen. Ein Standard ist darum eine Art Geschenk fuer die Qualitaet seiner Arbeit. Wenn Du einen eigenen Standard definiert hast, und sichergehen kannst, dass Deine Komposition damit klingt, ist es OK. Nur wird kein anderer Musiker Deine Kompositionen nachvollziehen, erweitern und verbessern koennen, weil die Synphonien heutiger Software keine Blockfloetenlieder mehr sind. Zitieren
GCRACK Geschrieben 25. März 2002 Geschrieben 25. März 2002 Und wenn man sich nicht entscheiden kann zwischen int main() und void main(), dann schreibt man einfach main() und fertig! So sinnlos es aussieht, der BorlandCompiler akzeptiert diese Schreibweise! Ich seh das auch nicht so eng ob void oder int Einige Bücher schreiben mit int andere mit void, so dass es in meinen Augen keine Nachteile hat wenn man void anstelle von int nutzt! Im prinzip ist main eine Funktion wie jede andere auch, und wenn ne x-beliebige Funktion void akzeptiert, dann sollte es auch keinen Standard geben der sagt main bedarf des Returnvalues integer! Solang das Programm läuft isses doch egal! Selbst die MSDN sagt dass nicht zwingend ein int zurückgegeben werden muss! Am besten man programmiert mit der WinApi, dann hat man eh nur eine Möglichkeit die main zu erstellen! Zitieren
gajUli Geschrieben 25. März 2002 Geschrieben 25. März 2002 Original geschrieben von GCRACK Im prinzip ist main eine Funktion wie jede andere auch, Nee, die ist was ganz Besonderes. int main() wird von der Laufzeitumgebung und nur von der Laufzeitumgebung gestartet und dies immer nur einmal. Alle anderen Funktionen werden von Funktionen aus aufgerufen und dies keinmal, einmal oder mehrmals. Zitieren
GCRACK Geschrieben 25. März 2002 Geschrieben 25. März 2002 Original geschrieben von gaiusjUlius Nee, die ist was ganz Besonderes. int main() wird von der Laufzeitumgebung und nur von der Laufzeitumgebung gestartet und dies immer nur einmal. Alle anderen Funktionen werden von Funktionen aus aufgerufen und dies keinmal, einmal oder mehrmals. Jo, OK, da haste natürlich recht, ich meinte auch viel eher dass der Aufbau der main-funktion identisch ist mit der einer 0815-Funktion! Und auch wenn man deren Hauptrolle innem Programm sieht, so ist der rückgabewert nicht das entscheidende! Da Windows nicht zwingend einen Rückgabetyp erwartet ist nix gegen void zu sagen! Und da viele Programmierer mit void main arbeiten, hat sich das wohl als ne Art Quasi-Standard festgesetzt! Und wer void main nutzt und will trotzdem nen RGW liefern, dann kann ja immer noch die exit()-Funktion einbauen! Zitieren
Orffi Geschrieben 25. März 2002 Autor Geschrieben 25. März 2002 main () ist kein C++! Allerdings ist es C nach dem 1989er Standard und ist die Kurzform für int main (). Wenn man also einfach main() schreibt, hat man sich in C für int main () entschieden. Für C++ gilt dies nicht! In C++ muß int als Rückgabewert angegeben werden. C99 akzeptiert main () auch nicht mehr sondern fordert int main (). Wenn Du tatsächlich Bücher hast, die void main () schreiben, dann wirf sie weg! Im Übrigen ist mir total egal was MSDN sagt. Mich interessiert nur was ISO sagt. Nochmal: wenn ein Compiler irgendeine schreibweise akzeptiert heißt es noch lange nicht, daß es auch richtig und damit standardkonform ist. (Es gibt auch seltene Fälle wo der Compiler meckert, obwohl es standardkonform ist. Dieser Fall tritt aber bei weitem nicht so häufig auf wie erstgenannte.) "Solang das Programm läuft isses doch egal!": Bitte glaubt mir, es ist nicht egal. Wenn Du einen Pudel hast, kannst Du ihn bei der Gelegenheit entkernen. Möge der Standard mit Euch sein Jan Zitieren
GCRACK Geschrieben 26. März 2002 Geschrieben 26. März 2002 Und was sagt ihr dazu: The ISO C++ Standard (ISO/IEC 14882:1998) specifically requires main to return int. But the ISO C Standard (ISO/IEC 9899:1999) actually does not. This comes as a surprise to many people. But despite what many documents say, including the Usenet comp.lang.c FAQ document (at great length), the actual text of the C Standard allows for main returning other types. Davon ausgehend dass C++ auf C basiert und aus Kompatibilitätsgründen auch C-Syntax akzeptiert müsste void main() also auch in C++ verankert sein, auch wenn es laut ISO nicht der Fall ist! Zitieren
Crush Geschrieben 26. März 2002 Geschrieben 26. März 2002 Das wäre eine Erklärung, wieso man in C++-Compilern bei void main() keine Fehlermeldung bekommt. Zitieren
gajUli Geschrieben 26. März 2002 Geschrieben 26. März 2002 Original geschrieben von GCRACK Und was sagt ihr dazu: The ISO C++ Standard (ISO/IEC 14882:1998) specifically requires main to return int. But the ISO C Standard (ISO/IEC 9899:1999) actually does not. Halte ich fuer eine dubiose Quelle, woher kommt das? Also ich hab einen iso-c Standard hier von Juni 1999, der sagt dies: [#1] The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent,9 or in some other implementation-defined manner. Wenn da etwas anderes als int zulaessig ist, dann kann das nur mit dem letzten Nebensatz erklaert werden. Der sagt aber ganz klar, wenn Du das machst, bist Du IMPLEMENTIERUNGSABHAENGIG (und das ist wohl das Schlimmste, was passieren kann, wenn man standardkompatibel programmieren moechte). Unter _dem_ C-Standard versteht die Community den von 1989. Was da spaeter irgendwelche Normierungs-Funktionaere veranstalten, naja ich weiss nicht, die wollen natuerlich gern ihren Job rechtfertigen... Und darum soll jetzt auch noch ISO-C++ veraendert werden? Also ich muss doch sehr bitten... Zitieren
GCRACK Geschrieben 26. März 2002 Geschrieben 26. März 2002 Hier hab ich die Infos her: http://homepages.tesco.net/~J.deBoynePollard/FGA/legality-of-void-main.html Zitieren
GCRACK Geschrieben 26. März 2002 Geschrieben 26. März 2002 Original geschrieben von gaiusjUlius Wenn da etwas anderes als int zulaessig ist, dann kann das nur mit dem letzten Nebensatz erklaert werden. Der sagt aber ganz klar, wenn Du das machst, bist Du IMPLEMENTIERUNGSABHAENGIG (und das ist wohl das Schlimmste, was passieren kann, wenn man standardkompatibel programmieren moechte). Es kann ja sein, dass man dann, wie du so schön sagst, Implementierungsabhängig ist. Trotzdem ändert das nix an der Tatsache dass der Funktionsaufruf void main() in der ISO so verankert und damit zulässig ist! Dass es so schwammig formuliert wurde dass jeder Compiler das unterschiedlich interpretiert ist wieder ne andere Sache! Zitieren
gajUli Geschrieben 26. März 2002 Geschrieben 26. März 2002 Danke, kurioser Typ, er bezieht sich tatsaechlich auf den Text, den ich oben zitiert habe und macht dann maechtig Stimmung, indem er auflistet, wie die beruehmten Compiler dieser Welt es handeln. (Seit wann haelt sich Microsoft an Standards?) *lol* Meine Meinung: Lieber nicht allzu ernst nehmen... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.