Wenn man sich trotzdem angewöhnt, das Doppelkreuz immer an den
Anfang der Zeile zu schreiben (und die Einrückung ggf. zwischen
Doppelkreuz und Direktive), kann einem so ein Fehler gar nicht
mehr passieren.
Der Präprozessor (bzw. das Preprocessing, wie es jetzt im C-Standard
heißt, da es nicht notwendig ein separater Prozessor sein muss, wie
das ganz am Anfang der Fall war) arbeitet (als einziges in der ganzen
C-Syntax) zeilenorientiert. Er liest dabei jeweils eine Zeile ein
(das ist eine logische Zeile, also backslash-newline-Fortsetzungen
werden alle miteinander verkettet) und gibt für jede eingelesene
Zeile eine (ggf. modifizierte) Zeile wieder aus. Daraus resultiert
einerseits, dass alle seine Direktiven am Anfang der Zeile stehen
müssen (um zu sehen, ob in dieser Zeile eine Direktive definiert
wird, muss er also nur von vorn beginnend ein Doppelkreuz suchen,
mittlerweile ggf. dabei Leerzeichen am Anfang überspringen), anderer-
seits folgt daraus auch, dass C-Programme immer aus kompletten Zeilen
aufgebaut sein müssen, die durch ein Zeilenendezeichen gemäß den
Definitionen des Hosts (LF, CR-LF, CR, was auch immer) abgeschlossen
ist. Wenn die letzte Zeile des Programms nicht mit einem Zeilenende-
zeichen beendet ist, entsteht meiner Erinnerung nach undefiniertes
Verhalten. Das ist auch erklärlich: es gestattet eine Implementierung
des Präprozessors, die die Verarbeitung der Zeile bis zum Auftreten
des Endezeichens verzögert. Eine nicht beendete Zeile würde in diesem
Falle ,,im Präprozessor stecken bleiben'', also nie zum eigentlichen
Compiler weiter gereicht.