Forum: Compiler & IDEs switch/case über mehrere Dateien


von Verteiler (Gast)


Lesenswert?

Ich hab hier (schwer verhunzten) Arduino-Code den ich auf einen anderen 
uC portieren möchte.
1
in myFile.cpp:
2
void myClass::select(int i)
3
{
4
  switch(i)
5
  {
6
#ifndef DISABLE_VARIANT_A  //definiert
7
  #include "driver_A.h"  //nicht includiert
8
#endif
9
#ifndef DISABLE_VARIANT_B // nicht definiert
10
  #include "driver_B.h"  // includiert
11
#endif
12
#ifndef DISABLE_VARIANT_C //definiert
13
  #include "driver_C.h"  //nicht includiert
14
#endif
15
}
16
17
in driver_B.h:
18
case 2:    // <--Hovertext: Syntax Error
19
  bla
20
  bla
Warum wird bei dem Wort 'case' schon ein Fehler erkannt?

: Verschoben durch User
von Marc (Gast)


Lesenswert?

Weil deine IDE keinen echten Parser und Präprozessor verwendet, sondern 
etwas einfacheres. Das ist üblich und wird sich ggf. ändern, wenn LLVM 
sich flächendeckend durchsetzt.

Und case ohne switch ist halt illegal.

von Verteiler (Gast)


Lesenswert?

Meenste?
Meine IDE ist Eclipse + ARM toolchain.

Könnte auch an was anderem liegen. Ich bekomm praktisch bei allem was 
ich eintrage nen Syntax Error. Als ob ich in diese .hpp Datei keinen 
Code schreiben darf...

von Sebastian V. (sebi_s)


Lesenswert?

Verteiler schrieb:
> Ich bekomm praktisch bei allem was
> ich eintrage nen Syntax Error. Als ob ich in diese .hpp Datei keinen
> Code schreiben darf...

Weiterhin einen Fehler der beim Mouseover angezeigt wird oder auch beim 
compilieren? Wenn nur beim Mouseover dann einfach ignorieren. Wenn beim 
compilieren die Fehlermeldung posten.

von Lutz H. (luhe)


Lesenswert?

int i;
i=1;
wie groß ist i in code?

von Verteiler (Gast)


Lesenswert?

Langsam versteh ich das...

Der Compiler sagt zwar, daß der Code fehlerhaft ist. Aber da der Code im 
Moment noch gar nicht aufgerufen wird, und deswegen auch nicht in ein 
Binärfile gegossen wird, läuft die Toolchain sauber durch.
Auch kann man ausserhalb einer Funktion dem Compiler in einer anderen 
Datei nicht einfach Code vor die Füße werfen. Bei der 
Arduino-Philosophie ist das anders, da scheint's zu gehen.

Lutz H. (luhe) schrieb:
>wie groß ist i in code?
0 Bytes, weil es nicht benutzt wird.


"Wir irren uns emopor." (Harald Lesch)

von Ulrich P. (uprinz)


Lesenswert?

Verteiler schrieb:
> Der Compiler sagt zwar, daß der Code fehlerhaft ist. Aber da der Code im
> Moment noch gar nicht aufgerufen wird, und deswegen auch nicht in ein
> Binärfile gegossen wird, läuft die Toolchain sauber durch.

Ich fürchte es ist umgekehrt. Der Editor parsed den Code auf Datei-Basis 
und für ihn steht das case in der Datei driver_B.h ohne switch() alleine 
in der Gegend herum. Daher merkt er das als Fehlerhaft an.

Der Compiler sieht aber ein
switch() {
case 2:
 bla bla
}

was vollkommen korrekt ist, weswegen er keinen Fehler meldet und einen 
ausführbaren Code erzeugt.

Ich weiß, dass man da geteilter Meinung sein kann, aber ich würde 
denjenigen, der solch einen zerfledderten Code schreibt (Und das auch 
noch mit invetierter Logik bei den #ifndef) mit einer Neunschwänzigen 
Katze durch alle Gassen treiben.

Wenn man die cases versehentlich doppelt vergibt, sucht man sich einen 
Wolf warum das so ist und wenn man Lücken lässt, wundert man sich, warum 
nix passiert.

Gruß
Ulrich

von Joe F. (easylife)


Lesenswert?

Wie wäre es denn mit einer weiteren "}" nach dem letzten #endif?

von Markus F. (mfro)


Lesenswert?

Wer so was schreibt, dem gehört der A.... verhauen. Aber richtig.

von Karl H. (kbuchegg)


Lesenswert?

Markus F. schrieb:
> Wer so was schreibt, dem gehört der A.... verhauen. Aber richtig.

Vor allen Dingen könnte man diesen ganzen switch-case schon mal in Frage 
stellen und sich fragen, warum der Autor hier keine virtuellen 
Funktionen auf abgeleiteten Klassen benutzt hat. Dann würde sich das 
ganze Problem von alleine in Luft auflösen.

Fallunterscheidungen, die auf einer Typkennung beruhen, sind in C++ 
meistens durch Polymorphie besser zu lösen.

von Joe F. (easylife)


Lesenswert?

Markus F. schrieb:
> Wer so was schreibt, dem gehört der A.... verhauen. Aber richtig.

Äh, wen meinst du jetzt?
Mich? In der Quelle sind 2x "{" aber nur 1x "}".

von Markus F. (mfro)


Lesenswert?

Joe F. schrieb:
> Äh, wen meinst du jetzt?

Jeden, der switch()-cases über include-Dateien verstreut.

: Bearbeitet durch User
von Eric B. (beric)


Lesenswert?

Ulrich P. schrieb:
> ich würde
> denjenigen, der solch einen zerfledderten Code schreibt (Und das auch
> noch mit invetierter Logik bei den #ifndef) mit einer Neunschwänzigen
> Katze durch alle Gassen treiben.

Vater, vergib ihnen, denn sie wissen nicht, was sie tun.

von Verteiler (Gast)


Lesenswert?

Autor: Karl Heinz (kbuchegg) (Moderator) schrieb:
>Vor allen Dingen könnte man diesen ganzen switch-case schon mal in Frage
>stellen und sich fragen, warum der Autor hier keine virtuellen
>Funktionen auf abgeleiteten Klassen benutzt hat. Dann würde sich das
>ganze Problem von alleine in Luft auflösen.
Wie schon in meinem Eingangspost geschrieben: Das ist 
Arduino-Bastlercode von der eher schrilleren Sorte.
Vieleicht hat der Bursche der das schrieb von virtuellen Funktionen 
keine Ahnung. In der Sw gehts um das Einbinden en von ca 15 
unterschiedlichen LCDs. Die Pflicht hat er gut hinbekommen, an der Kür 
hapert's den Arduinern halt gelegentlich. Der Bursche hat den gesamten 
(!) Code für die Displaytreiber in .h Dateien geschrieben. Schon drollig 
irgendwie.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Verteiler schrieb:
> Wie schon in meinem Eingangspost geschrieben: Das ist
> Arduino-Bastlercode von der eher schrilleren Sorte.

Und warum nimmst du diesen Scheiß dann? Meine Mutter hat mir vor mehr 
als einem halben Jahrhundert beigebracht, dass man Süßigkeiten die auf 
der Straße liegen liegen lässt.

von Oliver S. (oliverso)


Lesenswert?

Hannes Jaeger schrieb:
> Meine Mutter hat mir vor mehr
> als einem halben Jahrhundert beigebracht, dass man Süßigkeiten die auf
> der Straße liegen liegen lässt.

Das sieht ein Rheinländer aber ganz anders...

Oliver

von Ulrich P. (uprinz)


Lesenswert?

Ohne einen Streit über den Sinn oder Unsinn von C++ gegenüber C auslösen 
zu wollen, aber C++ verleitet einfach dazu nach dem Motto "Der Compiler 
wirds schon richten" zu arbeiten. Das treibt dann solche Stilblüten...

Man kann doch auch 100 verschiedene Displays einbinden, in dem man einen 
festen Satz von Funktionen gleichen Namens definiert. Und Funktionen, 
die von einem Display nicht unterstützt werden, kann man entweder leer 
definieren oder zumindest in der Debug-Version mit einem return -1 
ausstatten, dass man weiß, dass es das nicht gibt, was man da haben 
möchte.

Flexible Anbindung von Treibern macht der Kernel doch auch in ANSI-C mit 
ein paar C99 Extentions. Es ist einfach unfassbar, warum solch ein Murks 
da oben verzapft werden muss.

Aber alles Aufregen nützt nix, allen Rheinländern sollte man in dem Fall 
raten, die besonders harten Klümpchen aufzuheben und sie gezielt nach 
dem Author dieses Stücks Code zu werfen :)

von Rolf M. (rmagnus)


Lesenswert?

Ulrich P. schrieb:
> Ohne einen Streit über den Sinn oder Unsinn von C++ gegenüber C auslösen
> zu wollen, aber C++ verleitet einfach dazu nach dem Motto "Der Compiler
> wirds schon richten" zu arbeiten. Das treibt dann solche Stilblüten...

Das hat doch überhaupt nichts mit C++ zu tun. Den selben Murks könnte 
man ganz genauso auch in C schreiben.

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.