PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : preprocessor macros in c++


Gast
2005-11-20, 17:42:39
hallo, ich hab grad was herausgefunden.
hier ein beispiel makro:

#define ABS(x) ((x) < 0) ? -(x) : (x)

sehr einfach, macht den parameter positiv.

das rufe ich jetzt folgendermassen in meinem cpp programm auf:

cout << ABS(-5) << endl;

ergebnis sollte logischerweise "5" sein.

allerdings bekomme ich einen compilerfehler:

test.cpp:5: error: invalid operands of types `int' and `<unknown type>' to binary `operator<<'


den compilerfehler verstehe ich nicht so ganz ... irgendwie liegts wohl am "<<" operator, denn eine klassische C funktion funktioniert problemlos damit.


printf("%d\n", ABS(-5));


kann mir jemand den fehler erklären? mein compiler ist btw der g++

Neomi
2005-11-20, 18:27:50
Ersetze mal...

#define ABS(x) ((x) < 0) ? -(x) : (x)
... durch...

#define ABS(x) (((x) < 0) ? -(x) : (x))

Gerade bei Makros, die etwas berechnen (übrigens ziemlich böse, Inlinefunktionen sind da vorzuziehen), ist die Klammerung extrem wichtig.

Gast
2005-11-20, 18:50:48
danke, die klammern hams echt gebracht!

hab meine ausgabe jetzt einfach umgeschrieben:

cout << (ABS(-5) << endl;

Coda
2005-11-20, 19:15:21
Dafür gibt es std::abs aus <valarray>

Macros sind für generische Dinge dank Templates nicht mehr nötig und tendenziell gefährlich.

Trap
2005-11-20, 20:22:10
Macros sind gefährlich weil:
ABS(++x) !=++x, ABS(x);

zeckensack
2005-11-21, 03:43:28
Das Problem würde ja schon gelöst. Trotzdem noch zur Begründung.<...>

#define ABS(x) ((x) < 0) ? -(x) : (x)

<...>

cout << ABS(-5) << endl;

<...>

test.cpp:5: error: invalid operands of types `int' and `<unknown type>' to binary `operator<<'

Die Zeile mit dem Makro expandiert(e) zucout << ((5)<0)?-(5):(5) << endl;

Dir hat der operator << eine Seite des ternären Operators geklaut, weil er stärker bindet.

Das ist das gleiche wie dieses (interessanter Unterschied ganz rechts):cout << ((5)<0)?-(5): ((5)<<endl);