@Jens
die #defines werden NUR vom PräProzessor erfasst (Dum ist deine Aussage Falsch das der Compiler sie einsetzt. das macht der PräProzessor! Und das ist ein Unterschied ohne gleichen) und nicht vom Compiler selbst. #Defines arbeiten auf Textebene und sind daher schon sehr typunsicher!
Beispiel:
#define WORT "Das ist ein String";
std::string blub (WORT);
wenn de das schreibst wird dein Compiler jammern aber ohne ende, kann dir aber nicht den genauen fehler sagen weil er nicht weis das es etwas mit #define zu tun hat! (Woher auch, wird ja nicht vom Compiler erfasst sondern nur vom PräProzessor eingebaut!) Dabei liegt es am ; was in WORT drinsteht und es bei "blub" in den beiden klammern aufgerufen wird (Fatal!) Und mal ganz ehrlich, wenn dir der compiler das sagt, das
vor "blub" das ; fehle, (diesen error sagt er 100%) wie kommste dann bitte darauf, das es einfach nur an diesem Textbaustein namens #define lag?
oder wenn du schreibst
#define ZAHL 1
einefunktion (ZAHL);
was meinste was ZAHL für ein Typ ist? INT? FLOAT? DWORD? CHAR? CHAR*? STD:
TRING?
du weist es nicht, und diese Typunsicherheit kann dir gelegentlich Berechnungsfehler geben aus denen du erstmal nicht rauskommst weil du nicht weist das es an diesem Mist names #define liegt. #define hat KEINEN Typ, da er auf Textbasis arbeitet. Und da liegt schon der große Haken!
Mag sein das #define in den Code reinkopiert wird, da sie auf textbasis arbeiten. aber da sie vom compiler nicht erfasst werden sollte dies schon einer der Hauptpunkte sein sie für Makros und Variablen nicht zu benutzen.