Probleme mit #define in MPLAB

Gast #2791797
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
Gast #2791799
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
Gast #2791816
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?
Gast #2791832
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
Gast #2791879
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
?
Gast #2791884
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 :-)
Gast #2791899
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.
Gast #2791959
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
}
Gast #2791968
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...
Gast #2792054
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....
Gast #2792172
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
Gast #2814392
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren