Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-11 Diskussionsfäden Martin Dickopp
Jochen Heller <[EMAIL PROTECTED]> writes:

> Ich beginne nur gerade damit, mich mit C zu beschÃftigen und habe das
> Buch von Kernighan und Ritchie auf dem SchoÃ. Da habe ich gemerkt,
> wenn ich ein Programm kompiliere und eben nach der schlieÃenden
> geschweiften Klammer nicht nochmal Enter gedrÃckt hab, dass gcc dann
> bemerkt, dass da keine neue Zeile am Ende der Datei zu finden war. Und
> da ich diese Meldung ja auch von der /etc/fstab her kenne, wenn man es
> da eben nicht macht, ohne dass es weiter schlimm ist, mÃchte ich nur
> gerne mal wissen, aus welchem Grund stÃrt er sich eigentlich daran?

Zitat aus ISO/IEC 9899:1999 (der ISO-Norm, die die Sprache C definiert),
Abschnitt 5.1.1.2, Paragraph 1, AufzÃhlungspunktpunkt 2:

| [...] A source file that is not empty shall end in a new-line
| character, [...].

Kurz gesagt ist Dein Programm also kein korrektes C.

Etwas ausfÃhrlicher ausgedrÃckt ist Dein Programm (gemÃÃ der Definition
von "shall" in der genannten Norm) nicht streng konform. Ein konformer
C-Compiler darf auch nicht streng konforme Programme Ãbersetzen, ist
dann aber verflichtet, mindestens eine Diagnosemeldung auszugeben.

Martin



Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-11 Diskussionsfäden Thomas Jahns
Jochen Heller <[EMAIL PROTECTED]> writes:
> es ist wirklich nichts weltbewegendes oder störendes. Ich beginne nur 
> gerade damit, mich mit C zu beschäftigen und habe das Buch von 
> Kernighan und Ritchie auf dem Schoß. Da habe ich gemerkt, wenn ich ein 
> Programm kompiliere und eben nach der schließenden geschweiften Klammer 
> nicht nochmal Enter gedrückt hab, dass gcc dann bemerkt, dass da keine 
> neue Zeile am Ende der Datei zu finden war. Und da ich diese Meldung ja 
> auch von der /etc/fstab her kenne, wenn man es da eben nicht macht, 
> ohne dass es weiter schlimm ist, möchte ich nur gerne mal wissen, aus 
> welchem Grund stört er sich eigentlich daran? - Oder wird ihm durch die 
> letzte Leerzeile dann eindeutig das Ende der Datei angezeigt oder wie? 
> Ich mein er kompiliert ja das Programm, er sagt halt nur, dass die 
> letzte Zeile keine leere ist.

gcc stört das fehlende Zeilenende weniger (sonst würde gcc sich ja mit
einem Fehler verabschieden). Es gibt aber diverse für C-Programmierer
wichtige Tools, die das finale Zeilenende zwingend erwarten und auch der
ISO-Standard, der bestimmt, wie ein C-Programm auszusehen hat, geht von
der Existenz eines solchen "end-of-line indicator" aus:

Aus ISO/IEC 9899:1999, Section B, §5.2.1, p3: "In source files, there
shall be some way of indicating the end of each line of text;".

Thomas Jahns 
-- 
"Computers are good at following instructions,
 but not at reading your mind."
D. E. Knuth, The TeXbook, Addison-Wesley 1984, 1986, 1996, p. 9



Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Bruno Hertz
"Bruno Hertz" <[EMAIL PROTECTED]> writes:

> a.c:
>  #include "a.h"
>  int x=2; /* hier kriegen wir jetzt eigentlich #define blah 5x=2; */
>  int main() {
>   ...
>  }
>

Sorry, das sollte natürlich heissen

 /* hier kriegen wir jetzt eigentlich #define blah 5int x=2; */

Und weil wir dabei sind hier nochmal der Text aus ISO/IEC 9899:1999


 6.10.2 Source file inclusion

   Constraints

   1 A #include directive shall identify a header or source file that
 can be processed by the implementation.

   Semantics

   2 A preprocessing directive of the form

   # include  new-line

   searches a sequence of implementation-defined places for a header
   identified uniquely by the specified sequence between the < and >
   delimiters, and causes the replacement of that directive by the
   entire contents of the header. How the places are specified or the
   header identified is implementation-defined.


Insbesondere ist das Newline auf der #include Zeile Teil der (und
jeder Präprozessor) Direktive, würde also laut Standard mit ersetzt.

Wenn ich den Standard weiter durchwühlte würde ich wahrscheinlich
einen expliziten Hinweis finden, daß Implementierungen (i.e. Compiler)
zu fehlenden Newlines am Dateiende Warnungen ausgeben sollen. Im ANSI
C Standard hat's den nämlich gegeben ...

Gruss, Bruno.



Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Werner Mahr
Am Montag, 11. April 2005 01:40 schrieb Nico Jochens:

> Naja, das meinte ich ja. Gibt es denn einen Unterschied zwischen
> Newline und Linefeed?

Pauschal gesagt nein. Es scheint aber Systemabhängig zu sein wie das 
Ende einer Zeile aussieht. Manche machen nur ein LF, manche ein LF/CR.
Genau weiß ich zwar nicht wer was macht, aber das ging schon ein paar 
mal hier über die Liste.

-- 
MfG usw.

Werner Mahr
registered Linuxuser: 295882


pgp88TtbGTPEg.pgp
Description: PGP signature


Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Bruno Hertz
Werner Mahr <[EMAIL PROTECTED]> writes:

> Am Montag, 11. April 2005 01:01 schrieb Nico Jochens:
>
>> entschuldige das ich versucht habe zu helfen (siehe andere Mail von
>> dir). Ich habe da wahrscheinlich unrecht und vielleicht C mit der
>> bash verwechselt, k.A. Da ich aber eh nicht so viel Ahnung vom
>> programmieren habe, finde ich es sehr nett von dir das du mir und
>> allen anderen Programmieranfängern es soo einfach erklärt hast...und
>> mit so viel Aussagekraft...bist du Politiker?
>
> Mal ein bisschen anschaulicher (falls ich ihn richtig verstanden habe)
>
> #include "1.h"
> a=b+c;
>
> Nur ein Ausschitt, aber reicht zu zeigen. Für alle nicht Programmierer, 
> das include kopiert einfach den Inhalt der angegeben Datei an diese 
> Stelle.
>
> In 1.h steht jetzt irgendwas in der Art:
>
> b=6;
> c=7;
>
> Am Ende diese Datei steht jetzt aber kein Newline oder Ähnliches.
> Wenn der genannte Präprozessor fertig ist, sieht dein Quelltext in etwa 
> so aus:
>
> b=6;
> c=7;a=b+c;
>
> In diesem Beispiel würde das sogar funktionieren, da das Ende der 
> Anweisung jeweils durch ein Semikolon gekenzeichnet wird. Es gibt 
> allerdings auch Konstrikte ohne Semikolon am Ende (würde jetzt 
> wahrschienlich zu weit führen, ist ja auch nur ein Beispiel), und dann 
> hättest du zumindest eine schwer zu findenden Bug eingebaut.

Ich hatte doch schon das Schlagwort Makrodefinition erwähnt.

a.h:
 /* Ohne Newline am Ende */
 #define blah 5

a.c:
 #include "a.h"
 int x=2; /* hier kriegen wir jetzt eigentlich #define blah 5x=2; */
 int main() {
  ...
 }

So, das kannst du jetzt mit gcc -E a.c testen, und, quelle surprise,
es wird wider die Logik trotzdem das vom Entwickler vermutlich
Erhoffte herauskommen. Und zwar weil der gcc Präprozessor smart genug
ist hier ein Newline einzufügen.

Fakt ist aber, daß der Präprozessor komplette Zeilen inklusive Newline
prozessiert, aus dem Source File entfernt und ggf. mit ihrem Ergebnis
ersetzt. D.h. gcc macht eigentlich mehr als er sollte, und sagt
einfach nochmal Bescheid.

Gruss, Bruno.



Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Nico Jochens
On Mon, Apr 11, 2005 at 01:15:14AM +0200, Werner Mahr wrote:
Am Montag, 11. April 2005 01:01 schrieb Nico Jochens:
entschuldige das ich versucht habe zu helfen (siehe andere Mail von
dir). Ich habe da wahrscheinlich unrecht und vielleicht C mit der
bash verwechselt, k.A. Da ich aber eh nicht so viel Ahnung vom
programmieren habe, finde ich es sehr nett von dir das du mir und
allen anderen Programmieranfängern es soo einfach erklärt hast...und
mit so viel Aussagekraft...bist du Politiker?
Mal ein bisschen anschaulicher (falls ich ihn richtig verstanden habe)
#include "1.h"
a=b+c;
Nur ein Ausschitt, aber reicht zu zeigen. Für alle nicht Programmierer, 
das include kopiert einfach den Inhalt der angegeben Datei an diese 
Stelle.

In 1.h steht jetzt irgendwas in der Art:
b=6;
c=7;
Am Ende diese Datei steht jetzt aber kein Newline oder Ähnliches.
Naja, das meinte ich ja. Gibt es denn einen Unterschied zwischen
Newline und Linefeed?
Wenn der genannte Präprozessor fertig ist, sieht dein Quelltext in etwa 
so aus:

b=6;
c=7;a=b+c;
In diesem Beispiel würde das sogar funktionieren, da das Ende der 
Anweisung jeweils durch ein Semikolon gekenzeichnet wird. Es gibt 
allerdings auch Konstrikte ohne Semikolon am Ende (würde jetzt 
wahrschienlich zu weit führen, ist ja auch nur ein Beispiel), und dann 
hättest du zumindest eine schwer zu findenden Bug eingebaut.
Siehste, da kapiert man es schon besser. @Bruno oder sonstwen...wenn
der der Compiler die Datei nicht zeilenweise liest dann pro Zeichen
oder wie?
Habt ihr da nicht mal einen, bitte deutschsprachigen, Titel oder Link
der sowas in diesen Kleinkram auseinandernimmt und  erklärt?
schöne Grüße aus Hamburg
Nico
--
It`s not a trick...it`s Linux!  |  web: www.linico.de
  ---°°--- |  mailto: [EMAIL PROTECTED]
 Nico Jochens -- MCSE & CNA|  Registered Linux User #313928
HamburgGermany |  PGP-Signature: kommt noch


Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Werner Mahr
Am Montag, 11. April 2005 01:01 schrieb Nico Jochens:

> entschuldige das ich versucht habe zu helfen (siehe andere Mail von
> dir). Ich habe da wahrscheinlich unrecht und vielleicht C mit der
> bash verwechselt, k.A. Da ich aber eh nicht so viel Ahnung vom
> programmieren habe, finde ich es sehr nett von dir das du mir und
> allen anderen Programmieranfängern es soo einfach erklärt hast...und
> mit so viel Aussagekraft...bist du Politiker?

Mal ein bisschen anschaulicher (falls ich ihn richtig verstanden habe)

#include "1.h"
a=b+c;

Nur ein Ausschitt, aber reicht zu zeigen. Für alle nicht Programmierer, 
das include kopiert einfach den Inhalt der angegeben Datei an diese 
Stelle.

In 1.h steht jetzt irgendwas in der Art:

b=6;
c=7;

Am Ende diese Datei steht jetzt aber kein Newline oder Ähnliches.
Wenn der genannte Präprozessor fertig ist, sieht dein Quelltext in etwa 
so aus:

b=6;
c=7;a=b+c;

In diesem Beispiel würde das sogar funktionieren, da das Ende der 
Anweisung jeweils durch ein Semikolon gekenzeichnet wird. Es gibt 
allerdings auch Konstrikte ohne Semikolon am Ende (würde jetzt 
wahrschienlich zu weit führen, ist ja auch nur ein Beispiel), und dann 
hättest du zumindest eine schwer zu findenden Bug eingebaut.

-- 
MfG usw.

Werner Mahr
registered Linuxuser: 295882


pgpDaLKT54vGH.pgp
Description: PGP signature


Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Bruno Hertz
Nico Jochens <[EMAIL PROTECTED]> writes:

> On Mon, Apr 11, 2005 at 12:33:55AM +0200, Bruno Hertz wrote:
>>Jochen Heller <[EMAIL PROTECTED]> writes:
>>
>>> Hallo,
>>>
>>> es ist wirklich nichts weltbewegendes oder störendes. Ich beginne
>>> nur gerade damit, mich mit C zu beschäftigen und habe das Buch von
>>> Kernighan und Ritchie auf dem Schoß. Da habe ich gemerkt, wenn ich
>>> ein Programm kompiliere und eben nach der schließenden geschweiften
>>> Klammer nicht nochmal Enter gedrückt hab, dass gcc dann bemerkt,
>>> dass da keine neue Zeile am Ende der Datei zu finden war. Und da
>>> ich diese Meldung ja auch von der /etc/fstab her kenne, wenn man es
>>> da eben nicht macht, ohne dass es weiter schlimm ist, möchte ich
>>> nur gerne mal wissen, aus welchem Grund stört er sich eigentlich
>>> daran? - Oder wird ihm durch die letzte Leerzeile dann eindeutig
>>> das Ende der Datei angezeigt oder wie? Ich mein er kompiliert ja
>>> das Programm, er sagt halt nur, dass die letzte Zeile keine leere
>>> ist.
>>>
>>> Ich danke Euch für Eure Hilfe
>>
>>Er stört sich nicht daran, er warnt nur. Die Gründe kann ich nicht
>>definitv nennen, aber einer der unmittelbar einleuchtet ist daß C eben
>>auch einen Präprozessor mit einschließt, der z.B. includes
>>erlaubt. Stelle man sich also mal vor eine Source (i.A. ein Header,
>>aber das muß ja nicht so sein) mit einer Makrodefinition auf der
>>letzten Zeile und ohne Newline am Ende würde in ein anderes File
>>inkludiert ...
>
> Lieber Bruno,
>
> entschuldige das ich versucht habe zu helfen (siehe andere Mail von
> dir). Ich habe da wahrscheinlich unrecht und vielleicht C mit der bash
> verwechselt, k.A. Da ich aber eh nicht so viel Ahnung vom programmieren
> habe, finde ich es sehr nett von dir das du mir und allen anderen
> Programmieranfängern es soo einfach erklärt hast...und mit so viel
> Aussagekraft...bist du Politiker?

Nana, ein Späßle darf doch noch mal drin sein, oder? War ja nicht böse
gemeint. Außerdem ist doch der Ausblick auf die goldene Palme gar
nicht schlecht. Ich selbst wäre auch gern schon mal so nah dran
gewesen ... :)

Gruss, Bruno.



Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Nico Jochens
On Mon, Apr 11, 2005 at 12:33:55AM +0200, Bruno Hertz wrote:
Jochen Heller <[EMAIL PROTECTED]> writes:
Hallo,
es ist wirklich nichts weltbewegendes oder störendes. Ich beginne nur 
gerade damit, mich mit C zu beschäftigen und habe das Buch von 
Kernighan und Ritchie auf dem Schoß. Da habe ich gemerkt, wenn ich ein 
Programm kompiliere und eben nach der schließenden geschweiften Klammer 
nicht nochmal Enter gedrückt hab, dass gcc dann bemerkt, dass da keine 
neue Zeile am Ende der Datei zu finden war. Und da ich diese Meldung ja 
auch von der /etc/fstab her kenne, wenn man es da eben nicht macht, 
ohne dass es weiter schlimm ist, möchte ich nur gerne mal wissen, aus 
welchem Grund stört er sich eigentlich daran? - Oder wird ihm durch die 
letzte Leerzeile dann eindeutig das Ende der Datei angezeigt oder wie? 
Ich mein er kompiliert ja das Programm, er sagt halt nur, dass die 
letzte Zeile keine leere ist.

Ich danke Euch für Eure Hilfe
Er stört sich nicht daran, er warnt nur. Die Gründe kann ich nicht
definitv nennen, aber einer der unmittelbar einleuchtet ist daß C eben
auch einen Präprozessor mit einschließt, der z.B. includes
erlaubt. Stelle man sich also mal vor eine Source (i.A. ein Header,
aber das muß ja nicht so sein) mit einer Makrodefinition auf der
letzten Zeile und ohne Newline am Ende würde in ein anderes File
inkludiert ...
Lieber Bruno,
entschuldige das ich versucht habe zu helfen (siehe andere Mail von
dir). Ich habe da wahrscheinlich unrecht und vielleicht C mit der bash
verwechselt, k.A. Da ich aber eh nicht so viel Ahnung vom programmieren
habe, finde ich es sehr nett von dir das du mir und allen anderen
Programmieranfängern es soo einfach erklärt hast...und mit so viel
Aussagekraft...bist du Politiker?
schöne Grüße aus Hamburg
Nico
--
It`s not a trick...it`s Linux!  |  web: www.linico.de
  ---°°--- |  mailto: [EMAIL PROTECTED]
 Nico Jochens -- MCSE & CNA|  Registered Linux User #313928
HamburgGermany |  PGP-Signature: kommt noch


Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Bruno Hertz
Nico Jochens <[EMAIL PROTECTED]> writes:

> On Sun, Apr 10, 2005 at 11:43:42PM +0200, Jochen Heller wrote:
>>Hallo,
>>
>> es ist wirklich nichts weltbewegendes oder störendes. Ich beginne
>> nur gerade damit, mich mit C zu beschäftigen und habe das Buch von
>> Kernighan und Ritchie auf dem Schoß. Da habe ich gemerkt, wenn ich
>> ein Programm kompiliere und eben nach der schließenden geschweiften
>> Klammer nicht nochmal Enter gedrückt hab, dass gcc dann bemerkt,
>> dass da keine neue Zeile am Ende der Datei zu finden war. Und da ich
>> diese Meldung ja auch von der /etc/fstab her kenne, wenn man es da
>> eben nicht macht, ohne dass es weiter schlimm ist, möchte ich nur
>> gerne mal wissen, aus welchem Grund stört er sich eigentlich daran?
>> - Oder wird ihm durch die letzte Leerzeile dann eindeutig das Ende
>> der Datei angezeigt oder wie? Ich mein er kompiliert ja das
>> Programm, er sagt halt nur, dass die letzte Zeile keine leere ist.
>>
> Moin Moin,
>
> es wird ein EOF (End of file) oder ein LF (LineFeed) erwartet. Da der
> Compiler zeilenweise liest, erwartet er eine leere Zeile damit er weiß
> das Schluß ist.

Hättste auch noch gesagt er würd' zeilenweise kompilieren wäre 'ne
goldene Palme fällig gewesen.

Gruss, Bruno.



Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Bruno Hertz
Jochen Heller <[EMAIL PROTECTED]> writes:

> Hallo,
>
> es ist wirklich nichts weltbewegendes oder störendes. Ich beginne nur 
> gerade damit, mich mit C zu beschäftigen und habe das Buch von 
> Kernighan und Ritchie auf dem Schoß. Da habe ich gemerkt, wenn ich ein 
> Programm kompiliere und eben nach der schließenden geschweiften Klammer 
> nicht nochmal Enter gedrückt hab, dass gcc dann bemerkt, dass da keine 
> neue Zeile am Ende der Datei zu finden war. Und da ich diese Meldung ja 
> auch von der /etc/fstab her kenne, wenn man es da eben nicht macht, 
> ohne dass es weiter schlimm ist, möchte ich nur gerne mal wissen, aus 
> welchem Grund stört er sich eigentlich daran? - Oder wird ihm durch die 
> letzte Leerzeile dann eindeutig das Ende der Datei angezeigt oder wie? 
> Ich mein er kompiliert ja das Programm, er sagt halt nur, dass die 
> letzte Zeile keine leere ist.
>
> Ich danke Euch für Eure Hilfe

Er stört sich nicht daran, er warnt nur. Die Gründe kann ich nicht
definitv nennen, aber einer der unmittelbar einleuchtet ist daß C eben
auch einen Präprozessor mit einschließt, der z.B. includes
erlaubt. Stelle man sich also mal vor eine Source (i.A. ein Header,
aber das muß ja nicht so sein) mit einer Makrodefinition auf der
letzten Zeile und ohne Newline am Ende würde in ein anderes File
inkludiert ...

Gruss, Bruno.



Re: [OT] - Reine Interessensfrage zu gcc-Meldung

2005-04-10 Diskussionsfäden Nico Jochens
On Sun, Apr 10, 2005 at 11:43:42PM +0200, Jochen Heller wrote:
Hallo,
es ist wirklich nichts weltbewegendes oder störendes. Ich beginne nur 
gerade damit, mich mit C zu beschäftigen und habe das Buch von 
Kernighan und Ritchie auf dem Schoß. Da habe ich gemerkt, wenn ich ein 
Programm kompiliere und eben nach der schließenden geschweiften Klammer 
nicht nochmal Enter gedrückt hab, dass gcc dann bemerkt, dass da keine 
neue Zeile am Ende der Datei zu finden war. Und da ich diese Meldung ja 
auch von der /etc/fstab her kenne, wenn man es da eben nicht macht, 
ohne dass es weiter schlimm ist, möchte ich nur gerne mal wissen, aus 
welchem Grund stört er sich eigentlich daran? - Oder wird ihm durch die 
letzte Leerzeile dann eindeutig das Ende der Datei angezeigt oder wie? 
Ich mein er kompiliert ja das Programm, er sagt halt nur, dass die 
letzte Zeile keine leere ist.

Moin Moin,
es wird ein EOF (End of file) oder ein LF (LineFeed) erwartet. Da der
Compiler zeilenweise liest, erwartet er eine leere Zeile damit er weiß
das Schluß ist.
schöne Grüße aus Hamburg
Nico
--
It`s not a trick...it`s Linux!  |  web: www.linico.de
  ---°°--- |  mailto: [EMAIL PROTECTED]
 Nico Jochens -- MCSE & CNA|  Registered Linux User #313928
HamburgGermany |  PGP-Signature: kommt noch