Nach include zwingend Zeilenumbruch?
-
Hi(gh)!
(ich mache meine Drohung aus dem ersten Thread von heute wahr - ich ackere mich jetzt Seite für Seite durch den "Erlenkötter" und sobald irgendein Problem auftaucht, das ich nicht selbst zergoogeln kann, nerve ich Euch!)
Auf Seite 23 in "C - Programmieren von Anfang an" soll anhand einer absichtlich unübersichtlich gestalteten Version von bspl0001.c die weitestgehende Formatfreiheit von C demonstriert werden... leider scheitert dies schon in der zweiten Zeile, wo auf #include <stdio.h> gleich main() folgt... und prompt schmeißt mein gcc auch im C90-Modus die Fehlermeldung:
error: expected identifier or ‘(’ before string constant
3 | "\nDies ist ein erstes C-Programm.\n");printf(was gcc/g++-typisch (und mich traditionell schwer einschüchternd...) einen ganzen Rattenschwanz an weiteren zeilenbezogenen Fehlermeldungen nach sich zieht...
War es jemals (eventuell lange vor C90) möglich, ein C-Programm ohne Zeilenumbruch nach der include-Zeile zu kompilieren?
Bis bald im Khyberspace!
Yadgar
-
Nein, das ist ein Fehler im Buch. Alle Präprozessoranweisungen mit
#
am Anfang werden zeilenweise abgearbeitet und anschließend verworfen, ehe der Code an den eigentlichen Parser (für C bzw. C++) übergeben wird.Also kann man z.B. noch Kommentare direkt hinter
#include <...>
oder#ifdef ...
anfügen:#include <stdio.h> a comment #ifndef X another comment #error X not defined! #endif
s. Ideone Code 1 (welcher den GCC verwendet)
Ich habe extra#error
hier eingefügt, damit man die Warnungen bzgl. der Kommentare sehen kann.
Daher sollte man bei Kommentaren auch hier/*...*/
bzw.//
verwenden:
s. Ideone Code 2 (nun ohne Warnungen)Vor der Standardisierung mag es aber vllt. einzelne Compiler (bzw. deren Präprozessor) gegeben haben, die dies anders gehandhabt haben.
-
Wenn man im Internet nach diesem Buch (Auflage 1999) sucht findet man eine Leseprobe, in der dieser Sourcecode zu finden ist. Korrekt?
/* bspl10001.c */ #include <stdio.h> main() { printf("\nDies ist ein erstes C-Programm.\n"); printf("\nWie Sie sehen, kann 'printf' "); printf("nicht nur Texte drucken.\n"); printf("sondern auch rechnen.\n\n"); printf("13 * 7 = %i \n", 13 * 7); }
Da ist das einzige Problem, dass
main
ohne Rückgabetype definiert wird.
-
Hi(gh)!
@john-0 sagte in Nach include zwingend Zeilenumbruch?:
Wenn man im Internet nach diesem Buch (Auflage 1999) sucht findet man eine Leseprobe, in der dieser Sourcecode zu finden ist. Korrekt?
/* bspl10001.c */ #include <stdio.h> main() { printf("\nDies ist ein erstes C-Programm.\n"); printf("\nWie Sie sehen, kann 'printf' "); printf("nicht nur Texte drucken.\n"); printf("sondern auch rechnen.\n\n"); printf("13 * 7 = %i \n", 13 * 7); }
Da ist das einzige Problem, dass
main
ohne Rückgabetype definiert wird.Ja, richtig, ERLENKÖTTER hat das erste Beispielprogramm lediglich "layoutmäßig" variiert, um die (weitestgehende) Formatfreiheit von C zu demonstrieren - und dabei prompt schon den ersten "Bock geschossen"! Typisch deutsche Programmierliteratur, oder passiert das den Angelsachsen genau so häufig?
ḿain() ohne Rückgabetyp war zu Zeiten von C90 noch zulässig, wurde erst ab C99 "verboten" (strenggenommen ja nicht wirklich, es gibt eine Warnung, aber keine Fehlermeldung) - und der Redaktionsschluss von "C - Programmieren von Anfang an" lag offensichtlich kurz vor der Veröffentlichung von C99... sämtliche Beispiele im Buch haben main() ohne Rückgabetyp!
Bis bald im Khyberspace!
Yadgar
-
@Yadgar sagte in Nach include zwingend Zeilenumbruch?:
Ja, richtig, ERLENKÖTTER hat das erste Beispielprogramm lediglich "layoutmäßig" variiert, um die (weitestgehende) Formatfreiheit von C zu demonstrieren - und dabei prompt schon den ersten "Bock geschossen"! Typisch deutsche Programmierliteratur, oder passiert das den Angelsachsen genau so häufig?
In meiner Wahrnehmung: Nein, es sind bei den englischen Büchern weniger Fehler drin. Aber es gibt einen ganz offensichtlichen Bias: Schlechte englische Bücher würden nicht international bekannt, daher hätte ich sie weder gelesen, noch würde sie jemand für den deutschen Markt übersetzen.
Wobei ich sehr wenige Programmierbücher selber gelesen habe, das meiste ist der Eindruck hier im Forum. Da merkt man halt, dass die zitierten Beispiele aus K&R oder Stroustrup was taugen, die von Jürgen Wolf hingegen Quatsch sind. Jürgen Wolf wurde auch sicher nicht ins Englische übersetzt.
Man müsste jetzt eigentlich mal in eine englische Bibliothek gehen, und ein C-Buch aus den 90ern suchen, das so einen richtigen Massenwarentitel hat, und vergleichen. Von einem Autor, der Bücher zu 15 anderen Computerthemen hat.
-
@Yadgar sagte in Nach include zwingend Zeilenumbruch?:
ḿain() ohne Rückgabetyp war zu Zeiten von C90 noch zulässig,
Ich habe damals (Anfang der 1990er) C gelernt, und nein es war nicht mehr üblich das so zu machen. Alter Code ließ sich natürlich weiterhin so übersetzen. Das Problem ist, dass das Buch einen veralteten Stil pflegt, und das hätte man eigentlich damals schon nicht mehr tun sollen.
Das ist ungefähr so sinnvoll wie Fortran Neulingen im Jahr 2025 COMMON Blöcke als guten Stil nahezulegen. Es gibt seit Fortran 90 sehr viel bessere Alternativen.