[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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



Werner Mahr <werner@vollstreckernet.de> 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.



Reply to: