Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage: Preprocessor


von Martin (Gast)


Lesenswert?

Hallo,

es ist mir ein Missgeschick unterlaufen. Nach einem #define habe ich den 
Namen großgeschrieben und nach einem #ifdef kleingeschrieben.

...

#define BOOT_ARM

...

#ifdef BOOT_Arm

....

Gibt es einen Weg, dass das der Compiler/Preprocessor dies erkennt?

Viele Grüße

Martin

von astroscout (Gast)


Lesenswert?

spricht was dagegen, das kleimgeschriebene durch das Großgeschriebene zu 
ersetzen?
wenn es mehrere stellen im quelltext sind, gibr es dort ja die 
ersetzen-funktion

von thorstendb (Gast)


Lesenswert?

> Gibt es einen Weg, dass das der Compiler/Preprocessor dies erkennt?
1
#define BOOT_Arm BOOT_ARM

:-)

von Mobius (Gast)


Lesenswert?

Nein, der Preprocessor ist case sensitive. Da hilft nur Search & 
Replace. Sollten alle Texteditoren ab Notepad können, bzw. einige können 
das auch in allen geöffneten Dateien gleichzeitig.

Oder aber du änderst dein define auf klein, je nachdem was weniger 
Arbeit macht ;).
gruß
Mobius

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> Gibt es einen Weg, dass das der Compiler/Preprocessor dies erkennt?
Trollig... :-/
1
#define BOOT_ARM
2
#define BOOT_Arm BOOT_ARM
Oder...
1
#define BOOT_ARM
2
#define BOOT_Arm

Aber ich würde "Suchen und Ersetzen" vorschlagen...

von (prx) A. K. (prx)


Lesenswert?

thorstendb schrieb:

>> Gibt es einen Weg, dass das der Compiler/Preprocessor dies erkennt?
>
1
> #define BOOT_Arm BOOT_ARM
2
>

Sö, genau das geht eben nicht, wenn danach #ifdef statt #if verwendet 
wird. Denn BOOT_Arm ist auch dann definiert wenn BOOT_ARM nicht 
definiert ist.

Statt dessen wäre sowas nötig:
1
#ifdef BOOT_ARM
2
#define BOOT_Arm BOOT_ARM
3
#endif

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> Denn BOOT_Arm ist auch dann definiert wenn BOOT_ARM nicht definiert ist.
Ja, das ist schade... ;-)
Aber dann würde ich das, um Speicherplatz zu sparen, eher so machen:
1
#ifdef BOOT_ARM
2
#define BOOT_Arm
3
#endif
Und um alle anderen naheliegenden Schreibweisen auch noch abzufangen 
gleich so:
1
#ifdef BOOT_ARM
2
#define BOOT_Arm
3
#define Boot_Arm
4
#define Boot_ARM
5
#endif

von rogie (Gast)


Lesenswert?

Lothar Miller schrieb:
> A. K. schrieb:
>> Denn BOOT_Arm ist auch dann definiert wenn BOOT_ARM nicht definiert ist.
> Ja, das ist schade... ;-)
> Aber dann würde ich das, um Speicherplatz zu sparen, eher so machen:#ifdef 
BOOT_ARM
> #define BOOT_Arm
> #endif
> Und um alle anderen naheliegenden Schreibweisen auch noch abzufangen
> gleich so:#ifdef BOOT_ARM
> #define BOOT_Arm
> #define Boot_Arm
> #define Boot_ARM
> #endif


Und was ist, wenn irgendwo bOOt_aRm auftaucht?
Duck und wech

von codehamster (Gast)


Lesenswert?

Das Arme Boot...

von Martin (Gast)


Lesenswert?

Hoppla, da habe ich mich falsch ausgedrückt.

Gibt es einen allgemeinen Weg, Fehler (groß/klein) dieser Art 
abzufangen?

Zwei Wege den ich mir jetzt überlegt habe sind:

#ifdef BOOT_ARM
 C-Programmteil einfügen
#else
 Warnhinweis beim Compilieren ausgeben
#endif

... und ...

#ifdef BOOT_ARM_EIN
  C-Programmteil einfügen
#elif defined (BOOT_ARM_AUS)
  leere Anweisung
#else
  Warnhinweis beim Compilieren ausgeben, dass nicht gewählt wurde
#endif

Mit Lösung zwei kann ich mich anfreunden.

von Ztalan (Gast)


Lesenswert?

#error "This is the error"

#warning "I warned you before"

von StinkyWinky (Gast)


Lesenswert?

Beim gcc kann man -Wundef aktivieren, dann erhält man eine Warnung:
1
C:\MinGW\include\stdio.h 258 warning: no previous declaration for 'BLABLA'

von Alex W. (a20q90)


Lesenswert?

rogie schrieb:
> Und was ist, wenn irgendwo bOOt_aRm auftaucht?

Dann war ein ScriptKiddi am Code und Du kannst ihn eh vergessen...

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

rogie schrieb:
> Lothar Miller schrieb:
>> Und um alle anderen naheliegenden Schreibweisen auch noch abzufangen
>> gleich so:#ifdef BOOT_ARM
>> #define BOOT_Arm
>> #define Boot_Arm
>> #define Boot_ARM
>> #endif
>
>
> Und was ist, wenn irgendwo bOOt_aRm auftaucht?
> *Duck und wech*

Kein Problem. Da wir ja Emacs zur Hand haben (oder nicht?), kann man
folgendes tun:
1
(defun permute-case (str)
2
  "Return list of strings which represent all permutations of str with
3
respect to character case of each element. Only letters `A' through
4
`Z' (`a' through `z') will be affected."
5
  (if (> (length str) 1)
6
      (append (mapcar '(lambda (s)
7
       (concat (downcase (substring str 0 1)) s))
8
          (permute-case (substring str 1)))
9
        (mapcar '(lambda (s)
10
       (concat (upcase (substring str 0 1)) s))
11
          (permute-case (substring str 1))))
12
    (list (downcase (substring str 0 1)) (upcase (substring str 0 1)))))
13
14
15
(defun cpp-define-all-cases (str value)
16
  "Define CPP macros for all case permutations of STR with a common
17
VALUE and insert the result into the current buffer at point. Both STR
18
and VALUE are strings."
19
  (interactive "sMacro: \nsValue: ")
20
  (insert (loop for s in (permute-case str)
21
      concat (concat "#define " s " " value "\n"))))

--
Marcus

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.