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
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
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?
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
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
?
> 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:
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.
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...
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.
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.
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....
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
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