main
-
Hi,
in meinem Buch steht folgende mainmethode
#include <stdio.h> main() { printf("hello world"); }
In vielen anderen Tutorials wird es aber so beschrieben.
#include <stdio.h> int main() { printf("hello world"); return 0; }
Und in C von A bis Z so:
#include <stdio.h> int main(void) { printf("hello world"); return 0; }
Was ist richtiger C89 Standard?
-
Die Varianten 2 und 3 sind richtig (es macht keinen Unterschied, ob du da das void notierst oder nicht). Variante 1 wird von manchen Compilern gar nicht übersetzt, da falsch.
-
Ah ok danke. Das erste Beispiel ist wie gesagt aus meinem Buch dann sollte ich mir besser ein anderes kaufen. Könnt ihr was empfehlen? Achso, mein Buch heißt "The C Programming Language Second Edition" und ist von Kernighan und Ritchie.
Danke für die Hilfe schonmal.
-
Variante 1 entspricht wegen fehlendem return nicht C89.
-
danke, dann habe ich wohl doch ein falsches Buch. Wo kann ich den Standard C89 runterladen oder anschauen?
-
whitespaces schrieb:
danke, dann habe ich wohl doch ein falsches Buch. Wo kann ich den Standard C89 runterladen oder anschauen?
Bei einer Suchmaschine. Aber das willst du gar nicht. Der Standard liest sich wie ein Telefonbuch und ist für Anfänger absolut ungeeignet. Der Standard ist kein Lehrbuch sondern ein Nachschlagewerk für Leute die sich schon gut mit der Sprache auskennen, um solche Spezialfragen beantworten zu können.
-
für die die mit den Namen der beiden Autoren nichts anzufangen wissen:
http://www.informatik.uni-hamburg.de/Fachschaft/bits/1_ss95/node4.htmlAber die Uhren gehen weiter.
Was steht denn im Buch drin, wann das Herausgeben wurde?
MfG f.-th.
-
Hallo,
das Buch ist von 1988 es steht drin dass sie sich in dieser Auflage an den ANSI Standard richtet. Wortwörtlich steht dort:"This Second Edition of The C Programming Language describes C as defined by the ANSI standard."@SeppJ: Ich hätte schon gerne eine Möglichkeit den Standard einzusehen und habe selbstverständlich auch schon danach gegoogelt aber so viele verschiedene Draftst gefunden oder Seiten wo ich mir nicht sicher bin ob sie korrekt sind. Gegen Geld kann man sich auch wohl ein PDF runterladen, so weit wollte ich aber nicht gehen. Wenn nicht wüste was auf mich zukommt hätte ich nicht gefragt, genauso wenig wenn ich nicht schon danach gesucht hätte. Ich liebe sone Dokumente genau wie RFC oder Datenblätter von Halbleiterelementen. Aber wie schon gesagt, sonst hätte ich nicht gefragt.
Also kennt wer eine schöne Quelle wo ich mir den Standard von 89 runterladen kann?
-
Die betreffende Stelle im C99-Standard (C89 hab ich nicht hier) liest sich wie folgt:
ISO/IEC 9899:TC2 5.1.2.2.1 (1) schrieb:
The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and 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.
- Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as char ** argv, and so on.
Entgegen der landläufigen Meinung sind die Parameterlisten () und (void) nicht äquivalent - () bedeutet, dass eine beliebige Anzahl von Parametern angegeben werden kann. Etwa ist
void foo() {} void bar(void) { } int main(void) { foo(2); /* <-- völlig in Ordnung */ bar(2); /* <-- Compilerfehler. */ return 0; }
Auch ist es völlig legal, etwa
#include <stdio.h> void bar(); void bar(int x) { printf("%d\n", x); } int main(void) { bar(2); return 0; }
zu schreiben, obwohl ich diese Praxis nicht empfehlen kann.
Im Zusammenhang mit main macht es in der Praxis keinen Unterschied; main darf eh nicht rekursiv aufgerufen werden, und mir ist kein Compiler bekannt, der int main() ablehnt oder falsch verarbeitet. Streng genommen ist das vom Standard aber nicht gedeckt.
open-std.org hat einige der Standarddokumente hier. Auf der Seite der ISO gibt es alle C-Standards als PDF für lau, aber die ISO will trotzdem, dass du dich registrierst und eine Rechnungsadresse angibst - ich habe es nie eingesehen, das zu tun. Wenn dich das nicht kümmert, findest du die neueste Revision hier.
-
Wow, danke für die höchst professionelle Antwort.
-
Ich hab gerade gesehen, dass die Links, die ich da gegeben habe, nur Korrekturen am Standard beinhalten. Den kompletten, abgeschlossenen Standard wirst du ggf. von der ISO kaufen müssen, aber der Wikipedia-Artikel über C verlinkt auf den gegenwärtigen Komitee-Entwurf, was für alle praktischen Anwendungen ausreichen sollte. Ich zitiere auch nur daraus.
-
Die FAQ enthält ein Zitat aus dem C99 Final Draft: http://www.c-plusplus.net/forum/viewtopic.php?t=39346
main() { return 0; }
wäre iirc auch gültiges C89, da int wegen der implicit-int-Regel ohnehin als Returntyp angenommen wird. Aber imho ist das schlechter Stil.
-
Danke vielmals. Da ich mich nur für den c89 interessiere habe ich mir folgendes Dokument runtergeladen http://flash-gordon.me.uk/ansi.c.txt . Was sagt ihr entspricht das im Groben dem C89 ANSI bzw. ISO C90? Zu Main stehen da die zwei Varianten
The function called at program startup is named main . The
implementation declares no prototype for this function. It can 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[]) { /*...*/ }
Also wäre ein
int main() { /*...*/ }
nicht wirklich korrekter Code, auch wenn er so richtig kompiliert würde?
-
Den C89-Standard dürftest du eigentlich legal nirgendwo runterladen können, der kostet, damit verdient ANSI sein Geld. Die sogenannte "Rationale" hingegen ist frei, enthält aber nicht den Standard selbst sondern nur mehr oder weniger ausführliche Glossare u.ä.
In (aber sonst nicht empfehlenswerten) Schildts Buch ist der C89-Standard im Anhang abgedruckt.
-
Ich habe jetzt den C99 und die Vorreiter für den C89 das reicht zum mal drin stöbern. Wie sieht es nun mit dem int main() {} aus, Standard oder doch nicht Standard, weil nicht drin definiert?