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
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
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
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
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
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 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.