🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fido.ger.c_echo
Article #2

Char

#2
From: Horst Kraemer
Date: Tue, 09 Sep 1997 00:00
132 lines
4878 bytes
04 Sep 97  16:20:57, <Kai Grundmann> to <Andreas Polefka>:

 > AP> main()

 > IMO ist 'void main (void)' sauberer.

Im Gegenteil. In C ist 'main()' voellig korrekt und sauber.
Dies ist gleichbedeutend mit 'int main()'.

Wenn etwas 'unsauber' ist, dann 'void main()'.

Du solltest wissen, dass Du main() nicht fuer Dich, sondern fuer das C-
Laufzeitsystem (Der Startupcode, den Du zum Programm linkst) schreibst, das
main() aufruft, indem es sinngemaess

    int Rueckgabewert = main(argc,argv);

oder bei manchen Compilern auch

    int Rueckgabewert = main(argc,argv,envp);


aufruft. Da das Laufzeitsystem nicht in Deinen Code schaun kann, um
nachzusehen, wie Du geruht hast, main() zu deklarieren, sondern bereits fertig
compiliert vorliegt, musste es sich ein fuer alle Mal _vorher_ entscheiden, wie
es main() aufzurufen gedenkt. Der obige Aufrufcode des Laufzeitsystems liegt
also bereits unveraenderbar fest. Wenn Du die Funktion abweichend von der
Annahme des System anders als

    main()
    int main()
    main(argc, char** argv);
    int main(argc, char** argv);

oder auf den bewussten anderen Compilern auch

    main(argc, char** argv, char**envp);
    int main(argc, char** argv, char**envp);

deklarierst, so tust Du dies auf eigene Gefahr. In der Regel explodiert nichts,
wenn Du es tust. Wenn _Dein_ Compiler Dir schriftlich zusichert, dass Du auch
void main() oder double main() schreiben darfst, passiert bei _Deinem_ Compiler
_garantiert_ nichts.

Statt () _darfst_ Du in C auch (void) schreiben.


 > Habe das mal durch einen C++
 > Compiler gejagt, der wollte die voids haben.

Hier hast Du falsch interpretiert. Kein C++-Compiler will 'void main(void)'
haben. Weder als Rueckgabewert, noch als Parameterliste. Erstens bedeutet in
C++ eine leere Parameterliste () per definitionem dasselbe wie (void). Damit
ist (void) als Parameterliste in C++ schlicht ueberfluessig (obsolet) und kein
C++- Compiler wird es jemals statt () verlangen.

Richtig ist, dass C-und C++-Compiler einen Rueckgabewert 'void' _akzeptieren_,
aber einen C++-Compiler, der 'void' als Rueckgabewert von main() haben _will_,
kann es nicht geben.

Vielleicht meintest Du dies mit 'haben wollen':

Wenn Du in C oder C++

main() {
}

schreibst, erwartet der Compiler, dass Du einen int zurueckgibst, egal ob die
Funktion main() oder wurst() heisst. In C gibt's dann eine Warnung, in C++
einen Fehler. (function should/must return a value).

Diese _Fehlermeldung_ kannst Du _abschalten_, indem Du

    void main()

schreibst. Dies heisst, dass der Compiler nur dann void main() _haben_ will,
wenn Du _nichts_ zurueckgibst. Du musst es also umgekehrt interpretieren: Du
_sollst_ einen int zurueckgeben, damit der Compiler 'int main()' oder 'main()'
akzeptiert.

 > AP>   {
 > AP>   char* Zeile=new char[100];

 > Schaetze mal, das ist C++ fuer 'char Zeile [100];'.
 > Was tut das 'new'?

Nein, das ist C++ fuer  'char *Zeile=malloc(100);'

Ein char* ist auch in C++ ein char* und kein Array.

 > Nun das Beispiel in einfachem, funktionierendem C:

Mein C-Compiler gibt hier drei Warnungen aus. Mein C++-Compiler drei
Fehlermeldungen.

 > #include <string.h>

 > void main (void)
 > {
 >     char *Zeile [100];
 >     char *Anzahl [3];

Hier meintest Du, Deiner Annahme ueber C++ zufolge, wohl

     char Zeile [100];
     char Anzahl [3];

Wenn Du das, was Andreas geschrieben hat, in C nachbilden willst, musst Du

     char *Zeile=malloc(100);
     char *Anzahl=malloc(3);

schreiben. Der Zugriff ist in beiden Faellen derselbe.

 >     strcpy(Zeile, "blablablablablablabla");
 >     strcpy(Anzahl, Zeile + 5);
 > }

Dies geht wohl in die Hose. In einen Speicherbereich, fuer den nur 3 Bytes
reserviert ist, sollte man keine Zeichenkette der Laenge 16 zuzueglich  '\0'
kopieren - falls Du char Anzahl[3] meintest.

Bei Deiner tatsaechlichen Deklaration ist strcpy natuerlich voellig sinnleer,
da 'Zeile' und 'Anzahl' Arrays von char* sind und nicht Zeiger auf char oder
Arrays von char.


cu
Horst

e-mail: horst.kraemer@berlin.snafu.de
Technical Details
Message-ID: <MSGID_2=3A2410=2F249.5=40fidonet_7e08aeca@fidonet.org>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <MSGID_2=3A2437=2F41.2_d41ac3ce@fidonet.org>

Show Full Headers
Complete Article Headers
X-Google-Language: GERMAN,ASCII-7-bit
X-Google-Thread: 100a0f,2304ea64c9154e7f
X-Google-Attributes: gid100a0f,public
From: Horst.Kraemer@p5.f249.n2410.z2.fidonet.org (Horst Kraemer)
Subject: Char
Date: 1997/09/09
Message-ID: <MSGID_2=3A2410=2F249.5=40fidonet_7e08aeca@fidonet.org>
X-Deja-AN: 272568051
References: <MSGID_2=3A2437=2F41.2_d41ac3ce@fidonet.org>
X-FTN-Path: 2410/249 24/903 888 777 2480/2 13 843
X-Comment-To: (Kai Grundmann)
X-FTN-Tearline: FMail 1.02
X-FTN-Domain: Z2@fidonet
X-Gateway: FIDO .. gamma.ray.camelot.de [FIDOGATE 4.1.5]
X-FTN-Seen-By: 2480/300 412 843 861 3500 8013 2487/0 2490/2001 5001 2494/28 380
Organization: -= Berlin, tierra florida =-
Newsgroups: fido.ger.c_echo