002
20.10.2003, 09:07 Uhr
virtual
Sexiest Bit alive (Operator)
|
In der Regel machen diese Macros folgendes:
C++: |
#define max(a,b) ((a)<(b)? (b):(a)) #define min(a,b) ((a)<(b)? (a):(b))
|
Das hat verschiedene negative Auswirkungen, ich würde Dir daher - wenn Du die Möglichkeit hast - eher zu den C++ Templates min und max raten (Header algorithm). Zwei der wichtigsten negativen Nebenwirkungen sind:
C++: |
int a = 4; int b = 5;
int min = min(a++, b++);
|
Das mag zwar so schon schlechter stil sein, aber der unbefangene Beobachter mag denken, daß am Ende gilt:
C++: |
a == 5 b == 6 min == 4
|
(So wäre es jedenfalls, wenn min eine Funktion wäre). Tatsächlich ist aber:
C++: |
a == 6 // (!) b == 6 min = 5
|
Dies liegt daran, daß a oder b zweimal ausgwertet werden (je nach dem, wer größer ist). Häufoger findet man aber solche netten Fehler:
C++: |
long ziemlich_langsam(char c) { // Diese Routine is ziemlich langsam return ???; } ... long x = min(ziemlich_langsam('A'), ziemlich_langsam('B'));
|
Nur wird ziemlich_langsam dreimal aufgerufen. Das ist dann wirklich ziemlich Langsam!
Wenn Du mit diesen Makros arbeitest, solltest Du immer nur entweder Konstanten und einfache Variablen übergeben, niemals jedoch direkt den Rückgabewert einer Funktion odeer irgendwelche Ausdrücke, die einen Operator enthalten. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 20.10.2003 um 09:07 Uhr von virtual editiert. |