Forum: Compiler & IDEs #if #else #endif verursacht Fehlermeldung


von Benedikt (Gast)


Lesenswert?

Ich habe (wieder mal) Probleme mit dem NC30 Compiler von Renesas:
In einem Gerät werden 2 verschiedene LCDs verbaut, mit dem Unterschied
dass bei einem das Bild gespiegelt wird. Das möchte ich gerne mit
#define Mirror 0 (bzw. 1)
lösen.

Leider hat der Compiler aber was dagegen:

void Rotate (char Wert)
    {if (Wert==0)
        {#if Mirror==1
            SendCom(161);     //H-Mirror ON   Normal
         #else
            SendCom(160);     //H-Mirror OFF
         #endif
         SendCom (196);        //V-Mirror OFF
        }
     else
        {#if (Mirror==1)
            SendCom(160);     //H-Mirror OFF  180° gedreht
         #else
            SendCom(161);     //H-Mirror ON
         #endif

         SendCom (197);     //V-Mirror ON
        }}

Beim Compilen kommt immer dieser Fehler:
[Error(cpp30.53):S1D15712.c, line 309] elif/else sequence error
[Error(cpp30.55):S1D15712.c, line 311] endif sequence error
[Error(cpp30.53):S1D15712.c, line 317] elif/else sequence error
[Error(cpp30.55):S1D15712.c, line 319] endif sequence error

Bin ich zu blöd, oder ist der Compiler einfach scheiße ? Das es nicht
ganz den ANSI Standart erfüllt habe ich auf jedenfall schon gemerkt...

von Mike (Gast)


Lesenswert?

Man fragt da so:

#define Mirror 1
//alternativ #define Mirror 0

und dann:

#if mirror
...
#else
...
#endif

von Thomas (Gast)


Lesenswert?

nö, das problem an den beiden zeilen ist die führende geschweifte
klammer.

{#if Mirror==1
{#if (Mirror==1)

ändere das so, dass die #if anweisungen auf einer separaten zeile
stehen.


> Beim Compilen kommt immer dieser Fehler:

diese fehler kommen nicht vom compiler, sondern vom präprozessor. der
erkennt präprozessoranweisungen nur, wenn vor dem # nur whitespaces
stehen. alles andere wird nicht beachtet, deshalb erhältst du auch
keine fehlermeldung bei den #if zeilen.

von Chris (Gast)


Lesenswert?

@Benedikt:
"ANSI Standart"

Wie kann man denn nach ANSI-Art stehen?

SCNR

von Benedikt (Gast)


Lesenswert?

@Thomas
Stimmt, genau daran lag es.
Danke !

von Jörg Wunsch (Gast)


Lesenswert?

Btw., das Doppelkreuz muss nach Standard in der ersten Spalte stehen,
danach (vor dem define usw.) dürfen Leerzeichen folgen.  GCC's
Präprozessor akzeptiert die Anweisungen zwar auch mit führenden
Leerzeichen, aber das ist nicht vom Standard garantiert.

von ---- (Gast)


Lesenswert?

@Jörg: Deine kleine Info am Ende ist das Salz in der Suppe dieses
Forums. Nicht wirklich momentan wichtig, aber für's tiefere
Verständnis, bzw. potentielle zukünftige Probleme seehr brauchbar.
Danke.

----, (QuadDash).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.