Forum: Mikrocontroller und Digitale Elektronik Probleme mit #define in MPLAB


von W.B. (Gast)


Lesenswert?

Hallo.

Ich habe gerade ein kleines µC-Programm vor mir liegen worin die Zeile

#define SWITCH 0

vorkommt.
Compilieren funktioniert wunderbar.
Sobald ich aber den Wert auf 1 ändere, kommen die Fehlermeldungen:

*** Error 125 "...\define.h" Line 13(9,15): Duplicate #define
*** Error 43 "...\define.h" Line 13(16,17): Expecting a declaration

Die Einzige Codestelle wo SWITCH verwendet wird sieht so aus:

#ifdef SWITCH
#define PACKET_LEN 17
#else
#define PACKET_LEN 33
#endif

Woran kann das liegen?
Gibt es Probleme weil "SWITCH" ein Keyword ist? Warum funktioniert es 
dann aber mit dem Wert 0?

Ich verwende einen PIC16 und den CCS-Compiler.

fg

von Peter II (Gast)


Lesenswert?

W.B. schrieb:
> Sobald ich aber den Wert auf 1 ändere, kommen die Fehlermeldungen:
>
> *** Error 125 "...\define.h" Line 13(9,15): Duplicate #define
> *** Error 43 "...\define.h" Line 13(16,17): Expecting a declaration

dann gibt es noch eine 2.Stelle wo

#define SWITCH 0


steht, oder es wird dem compiler übergeben -DSWITCH=0

von W.B. (Gast)


Lesenswert?

In den verwendeten Files kommt das #define nur an den beiden genannten 
Stellen vor. Hab gerade nochmal alles überpüft.
Und der Compiler wird wie folgt aufgerufen:

Executing: "C:\Program Files\PICC\Ccsc.exe" "bio.c" +FM +DF +LN +T -A +M 
+Z +Y=9 +EA

Ist der Präprozessor eigentlich ein Teil vom CCS-Compiler oder von 
MPLAB?

von Stefan (Gast)


Lesenswert?

Möglicherweise hast Du deine Header Datei in mehreren C Dateien 
eingebunden, und sie enthält keine Schutz vor doppelter Ausführung. Etwa 
so:

#ifdef DEFINE_H
#define DEFINE_H

#define ...
#define ...
#define ....

#endif

von Stefan (Gast)


Lesenswert?

Die erste Zeile muss mit ifndef beginnen, sorry.

von Edson (Gast)


Lesenswert?

> Ist der Präprozessor eigentlich ein Teil vom CCS-Compiler oder von MPLAB?

Der Präprozessor gehört zum Compiler.

von W.B. (Gast)


Lesenswert?

Hallo Stefan,

dein Ansatz war zwar gut und, leider hat er in meinem Fall auch nicht 
geholfen.

Ich habe aber gerade bemerkt, wenn ich SWITCH garnicht definiere aber 
trotzdem mit #ifdef SWITCH überprüfe, kann ich es auch compilieren.
Irgendwo muss das SWITCH also definiert sein, weiß aber nicht wo....


Eine andere Frage habe ich auch noch:
Was ist der Unterschied zwischen
#if    SWITCH  und
#ifdef SWITCH
?

von g457 (Gast)


Lesenswert?

> Ich habe aber gerade bemerkt, wenn ich SWITCH garnicht definiere aber
> trotzdem mit #ifdef SWITCH überprüfe, kann ich es auch compilieren.

mach mal nicht nur compilieren sondern sowas:
1
#ifdef switch
2
   #error iss definiert
3
#else // switch
4
   #error iss nicht definiert
5
#endif // switch

..und dann such nochmals ganz genau :-)

von W.B. (Gast)


Lesenswert?

Also ich hab jetzt folgendes Probiert:

#ifdef SWITCH
#error definiert
#else
#error nichtdefiniert
#endif

#define SWITCH 1

Compiler meldet:
Executing: "C:\Program Files\PICC\Ccsc.exe" "bio.c" +FM +DF +LN +T -A +M 
+Z +Y=9 +EA
*** Error 119 "...\define.h" Line 20(7,22):  nichtdefiniert
*** Error 125 "...\define.h" Line 23(9,15): Duplicate #define
*** Error 43 "...\define.h" Line 23(16,17): Expecting a declaration
      3 Errors,  0 Warnings.


Ich habe das Problem natürlich schon längst behoben, indem ich ein 
anderes Wort als #define verwendet habe.
Trotzdem würd's mich interessieren was dahinter steckt.

von Stefan (Gast)


Lesenswert?

Ach ja natürlich (Kopf gegen die Tischkante schlagend)!

Switch ist doch ein reserviertes Schlüsselwort, für die switch-case 
Anweisung. Ist ja klar, das switch schon definiert ist.
1
switch(a) {
2
  case 1: doSomething();
3
          break;
4
  case 2: doSomething();
5
          break;
6
  else:   doSomethingElse();
7
}

von W.B. (Gast)


Lesenswert?

Das habe ich ja auch gefragt im ersten Post ;)
Aber unterscheidet der Präprozessor da nicht zwischen Groß und 
Kleinschreibung?
Weil switch != SWITCH, zumindest in C.

Und warum funktioniert das mit #define SWITCH 0 ?
Da müsste es ja auch Probleme geben wenn er switch mit 0 ersetzt.

Ganz klar ist mir das noch nicht...

von Karl H. (kbuchegg)


Lesenswert?

Stefan schrieb:
> Ach ja natürlich (Kopf gegen die Tischkante schlagend)!
>
> Switch ist doch ein reserviertes Schlüsselwort, für die switch-case
> Anweisung. Ist ja klar, das switch schon definiert ist.

C ist immer noch case-senstiv.

D.h. 'switch' und 'SWITCH' sind 2 Paar Schuhe.

von Karl H. (kbuchegg)


Lesenswert?

W.B. schrieb:

> Ganz klar ist mir das noch nicht...

Entweder du zeigst mal alles, oder die Raterunde tippt immer noch auf: 
Irgendwo, eventuell in einem Header File (kann auch ein 
'Pic-spezifisches System Header File' sein), gibt es noch ein zweites 
SWITCH.

Der Präprozessor saugt sich das ja nicht aus den Fingern um dich zu 
ärgern.

von W.B. (Gast)


Lesenswert?

Den Original-Code darf ich nicht posten, aber ein neues Beispielprogramm 
bringt den selben Fehler:

#include <16F874.H>

#define SWITCH 1

int main() {
  int i = 0;

  while(1){
    i++;
  }

  return 0;
}


Im PIC-Include-File gibt es kein SWITCH.
Es wird wohl wirklich wegen dem switch-case sein.
Ob es jetzt Case-Sensitive ist oder nicht, der Compiler will nicht....

von Stefan (Gast)


Lesenswert?

Tritt der Effekt auch mit CASE, IF, WHILE, LOOP etc auf?

von Peter II (Gast)


Lesenswert?

was passiert wenn du die Reihenfolge tauschst?
1
#define SWITCH 1
2
#include <16F874.H>

von W.B. (Gast)


Lesenswert?

Hi Stefan,
gute Idee - eigentlich hätte man da selbst draufkommen können....

IF, ELSE, CASE usw funktionieren alle nicht.
Diese Keywords sind scheinbar weder groß, noch klein geschrieben 
zulässig.

LG

von W.B. (Gast)


Lesenswert?

Falls es noch jemanden interessiert:

Der CCS-Compiler ist standardmäßig NICHT Case-Sensitive.
Etwas eigenartig, da es ja eigentlich dem C-Standart widerspricht.
Aber man kann mit #CASE den Compiler auf Case-Sensitive umstellen.

lg

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.