PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausdruck in C ersetzen? Wie?


Flying Fish
2003-04-14, 19:18:23
Ich will einen Ausdruck wie z.B. "*PORTE & bit_2" in meinem Programm durch eine Abkürzung wie etwa "SML" einfach ersetzen. Es geht also um reinen Textersatz der Übersichtlichkeit halber. Wie mache ich das? Mit einem Makro?

Einfachkrank
2003-04-14, 19:56:06
Hi,

vielleicht einfach einen konstanten String anlegen ???
const char SML[] = "PORTE & bit_2";wäre zumindest eine Möglichkeit... aber mit einem Makro dürfte es auch gehen, bin mir nur nicht mit Text so sicher ???

MFG Einfachkrank

Demirug
2003-04-14, 20:14:37
Einfachkrank, da es ja um Code geht ist ein Preprozessor Makro im Prinzip schon das richtige.

Persönlich bin ich aber kein Freund von Makros. Aus diesem Grund lasse ich den Code entweder so wie er ist oder benutze eine (inline) Funktion für solche Sachen.

Der Preprozessor gehört abgeschaft. Für bedingte Compilierung kann man ja dann was anderes einführen was der Compiler direkt beherscht.

stabilo_boss13
2003-04-14, 20:14:46
Das geht schon mit einem Makro:


#define SML "*PORTE & bit_2"
.
.
.
cout << SML;

Muss man nur aufpassen bei Klammern.

Flying Fish
2003-04-14, 20:28:15
Kommt das bei der Makrodefinition wirklich in Semikolon, und nicht im Klammern?

Ich dachte evtl. so:

#define SML (*PORTE & bit_2)


???

Unregistered
2003-04-14, 20:46:04
Originally posted by Flying Fish
Kommt das bei der Makrodefinition wirklich in Semikolon, und nicht im Klammern?

Ich dachte evtl. so:

#define SML (*PORTE & bit_2)


???

Das sind Anführungszeichen, ein Semikolon wäre das: ";" (Strichpunkt).

Imho sind die Zeichen schon richtig.

stabilo_boss13
2003-04-14, 20:46:45
Originally posted by Flying Fish
Kommt das bei der Makrodefinition wirklich in Semikolon, und nicht im Klammern?

Ich dachte evtl. so:

#define SML (*PORTE & bit_2)


??? Ich vermute du meinst Anführungszeichen und nicht Semikolon. Aber trotzdem:
Das kommt auf den Verwendungszweck an!
Das ist genau das Gefährliche an den Makros. Es handelt sich hier um reine Textersetzung.
Dein Define würde Folgendes ergeben:

cout << (*PORTE & bit_2);

Mit Anführungszeichen heisst es:

cout << "*PORTE & bit_2";


Fehler sind hier meist Klammern:
Der Präprozessor würde bei

#define quadrat(a) a*a

die Anweisung quadrat(1+1) ersetzen durch 1+1*1+1. Das ergäbe aber 3 (Punkt vor Strich)!

Richtig wäre also

#define quadrat(a) (a)*(a)

Hier ergibt sich dann (1+1)*(1+1) also 4.

Xmas
2003-04-14, 23:20:19
Und bei quadrat(a++) hätte man wieder Probleme...

Deswegen stimme ich da Demirug zu. Makros sollten wann immer möglich durch inline-Funktionen ersetzt werden, und Konstantendefinitionen immer mit const, nicht #define.