Forum: Compiler & IDEs Void oder nicht void ist hier die Frage


von Rene T. (Gast)


Lesenswert?

Ich habe mir gerade DAS C GRUNDLAGENBUCH von gerhard Willems gekauft, da 
ich das C++ Buch von ihm super gut erklärt fand und es auch entsprechend 
bei amazon bewertet wurde..

Nun begint bei C++ das Beispiel mit
void main();

wohingen es bei C mit

main();

beginnt..
Tatsächlich akzeptiert der C Compiler von Mkroe beides, weißt aber 
darauf gi das für mein kein rückgabewert definiert ist...

Hat sich hier im laufe der Entwicklungszeit von c einfach was geändert?!
Aucg seite 545 wird dann das erste mal von void gesprochen

Auch beinhalten nun die beispielprogramme diese beispiele..dennoch wird 
bei main () imme r das void weggelassen...

von Beidhänder (Gast)


Lesenswert?

Rene T. schrieb:
> void main();
Doppelt falsch, wobei ich allerdings annehme, dass das Semikolon von dir 
kommt.

Rene T. schrieb:
> main();
Und auch falsch.

"main()" darf es in einem Projekt nur einmal geben und das ist mit 
Rückgabetyp int. Alles andere ist falsch, sowohl in C, als auch in C++.

Dass manche 1/(a+b) zu 1/a+1/b auflösen macht es auch nicht richtiger.

von Rene T. (Gast)


Lesenswert?

es ist natürlich main() gemeint..........

und wenn
void main()
besser ist...
ist
void main(void) dann noch richtiger?!?

von Beidhänder (Gast)


Lesenswert?

Rene T. schrieb:
> und wenn
> void main()
> besser ist...
Ist es nicht. Das ist falsch. "int main(void)" geht aber, glaube ich. 
Das finde ich aber nicht schön mit dem void. Warum soll man in etwas, 
das leer sein soll, etwas hineinschreiben, um zu zeigen, dass es leer 
ist, anstatt es einfach leer zu lassen, wenn dadurch absolut keine 
Doppeldeutigkeit entsteht?

von Rene T. (Gast)


Lesenswert?

"Warum soll man in etwas,
das leer sein soll, etwas hineinschreiben, "
!?!?
void main()
ist in vier Büchern die ich hier habe die gängige Einleitung!
Man sollte es reinschreiben damit es klar ist und nicht vom Kompiler 
einfach mit einem INT angenommen wird....so die Erklärungen die ich dazu 
finde
void für nichts und wenn das da schon immer geschrieben wird.warum dann 
nicht in den Klammern?!?

main()
geht auch, aber scheint nicht ganz korrekt zu sein, da der Compiler dann 
eben nur davon ausgeht das es sich um INT handelt...

puhhh..ich weiß schon warum ich seit Jahren mit Pasal schreibe...da 
stoße ich nicht gleich am Anfang auf Wiedersprüche und unterschiedliche 
Meinungen..bei Psal ist es wie es ist, und das ist dann richtig oder 
falsch....

Naja..etwas versuche ich es noch in c aber das ganze scheint mir 
wirklich sehr fehleranfällig :-(

von DirkB (Gast)


Lesenswert?

Laut C-Standard (seit C89) ist
1
int main()
2
int main(void)
3
int main(int,char**) // meist als int main(int argc, char** argv)
erlaubt.

Im ersten K&R stand noch was anderes, aber das ist ja nur etwas über 25 
Jahre her.

Eine leere Paramterliste bedeutet in C, dass beliebige Paramter 
übergeben werden könne.
Das void jedoch zeigt an, das es keine Parameter gibt.


@Rene T.
Im Gegensatz zu Pascal halten sich aber alle modernen C-Compiler an den 
Standard (auch wenn er bei manchen doch veraltet ist).

von (prx) A. K. (prx)


Lesenswert?

Rene T. schrieb:
> void main();

Hoffentlich nicht.

> main();

Hoffentlich nicht.

Dieser K&R Stil ist seit 1989 obsolet.

Bei Mikrocontrollern ohne Betriebssystem ergibt ein Return-Wert nicht 
viel Sinn. Unter Betriebssystemen hingegen ist er Pflicht.

von Rene H. (Gast)


Lesenswert?

Korrekt ist:
1
int main(int argc, char **argv)
2
{
3
   ....
4
5
   return(0);
6
}

Wobei sich das auf einem Mikrocontroller relativiert.

Grüsse,
René

PS: ich muss mich korrigieren, korrekt ist falsch, vollständig sollte es 
heissen.

von Rene T. (Gast)


Lesenswert?

hm..ok..also laut lcc scheint

#include <stdio.h>
#include <stdlib.h>

void main(void)

{
  system("cls");
  printf ("Dies ist Dein erstes Programm :-)\n");
  getchar();

}

absolut korrekt zu sein WENN kein Wert übergeben werden soll oder eben 
wie bereits genannt

#include <stdio.h>
#include <stdlib.h>

int main(void)

{
  system("cls");
  printf ("Dies ist Dein erstes Programm :-)\n");
  getchar();
        return 0;
}

von (prx) A. K. (prx)


Lesenswert?

Zulässig in C99/C11:
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
"... or in some other implementation-defined manner."

von omg (Gast)


Lesenswert?

Rene T. schrieb:
> void main(void)

Schmeiss die Bücher die dir soetwas verkaufen wollen einfach weg, da 
wird mich Sicherheit noch mehr Unsinnn drin stehen. Gib nicht C die 
Schuld, sondern such sie bei deinen schlechten Büchern.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rene T. schrieb:
> laut lcc

lcc ist kein Kriterium für Korrektheit.

Es wurde natürlich schon viel darüber geschrieben, dass in einem
konformen Programm main() immer „int“ zurückgibt.  So sollte man es
sich auch einfach grundsätzlich angewöhnen.

Der Vollständigkeit halber sei erwähnt, dass diese Forderung sich nur
auf Programme bezieht, die in einem hosted environment laufen. Für
solche, die in einem freestanding environment laufen, erlegt der
Standard keine weiteren Verpflichtungen für main(); selbst die Tatsache,
ob das Programm überhaupt mit main() beginnen muss, ist dort nicht
mehr festgelegt.  (Das ist zumindest für die Sprache C der Fall;
inwiefern C++ auch die Unterscheidung zwischen hosted und freestanding
kennt, ist mir gerade nicht bekannt.)

Da wir im GCC-Forum sind: die Unterscheidung zwischen hosted und
freestanding erfolgt dort über -fhosted oder -ffreestanding.

Um jetzt die „Hurra!, hab' ich's doch schon immer gewusst“-Rufer etwas
zu dämpfen: selbst in einer Microcontroller-Umgebung fährt man in der
Regel jedoch gut damit, sie als hosted anzusehen, zumindest, solange
man sich auch auf eine (wenigstens in Teilen) standardkonforme
Bibliothek stützen möchte.  Damit erlaubt man dem Compiler nämlich,
dass er selbst Annahmen bezüglich der vom Standard definierten
Bibliotheksfunktionen machen kann, sodass er beispielsweise
„strlen("foo")“ durch die Konstante ‚3‘ ersetzen kann.  In einem
freestanding environment darf er keinerlei Annahmen mehr über die
Wirkungsweise der Funktion strlen() treffen, sondern wird gezwungen,
sie zur Laufzeit aufzurufen.  (Derartige Beispiele gibt es zahllose.)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.