Präprozessor error

Gast #1311801
Hallo zusammen,

Ich möchte folgende Präprozessor Anweisung anwenden
1
switch(channel)
2
      {
3

4
        case 6:    #ifdef __LOW_SIDE__
5
                   PORT1  &= ~(1<<OUT6);
6
                   #endif
7

8
                   #ifdef __HIGH_SIDE__
9
                   PORT1  |= (1<<OUT6);
10
                   #endif  
11
                   break;

Aber das gibt folgende Errors:

../manageOutputs.c:913: error: stray '#' in program
../manageOutputs.c:914: error: lvalue required as left operand of 
assignment
../manageOutputs.c:915:9: error: #endif without #if

Kann mir jemand sagen wo der Fehler liegt?
Gast
Das ändert leidert auch nichts.

Es ist doch prinzipiell richtig dass nach #ifdef ein #endif kommt, ich 
verstehe nicht was für ein Problem der Compiler hier hat...?
doch, das ändert sehr wohl etwas:
1
switch(channel)
2
      {
3

4
        case 6:    // hier eine neue Zeile anfangen!!!!!!!!!!!!!!
5
                   #ifdef __LOW_SIDE__
6
                   PORT1  &= ~(1<<OUT6);
7
                   #endif
8

9
                   #ifdef __HIGH_SIDE__
10
                   PORT1  |= (1<<OUT6);
11
                   #endif  
12
                   break;
Gast
Dennis schrieb:
> Jetzt versteh ich, tatsächlich es geht. Der Grund ist mir ein Rätsel...

Das hat der Erfinder mal so festgelegt. War wohl einfacher zu 
implementieren.
Sven P. schrieb:
> Dennis schrieb:
>> Jetzt versteh ich, tatsächlich es geht. Der Grund ist mir ein Rätsel...
>
> Das hat der Erfinder mal so festgelegt. War wohl einfacher zu
> implementieren.

Wenn mein Gedächtnis nicht trügt, war es ursprünglich auch so, dass das 
# am Zeilenanfang stehen musste. Das wurde später dann gelockert, als 
Einrückungen in Mode kamen.
Moderator Persönliche Seite
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.