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
> Ist der Präprozessor eigentlich ein Teil vom CCS-Compiler oder von MPLAB?
Der Präprozessor gehört zum Compiler.
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:
1 | #ifdef switch |
2 | #error iss definiert |
3 | #else // switch |
4 | #error iss nicht definiert |
5 | #endif // switch |
..und dann such nochmals ganz genau :-)
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.
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 | }
|
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....
was passiert wenn du die Reihenfolge tauschst?
1 | #define SWITCH 1
|
2 | #include <16F874.H> |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.