Zum Inhalt springen

Die main-Funktion im Standard


Orffi

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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....

Link zu diesem Kommentar
Auf anderen Seiten teilen

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".

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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! ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...