Zitat Zitat von Siro
ich denke, bzw. ich hoffe doch, daß der Compiler stets den ausgerechneten Wert, in diesem Falle 6 einsetzt. Dafür sorgt der "Preprozessor" wenn ich mich nicht irre. Das Define wir doch vom Preprozessor ausgewertet, bevor der Compiler überhaupt loslegt. Also sollte der Compiler eigentlich immer diese entsprechend vorausberechnete Konstante einsetzen.
Das funktioniert so leider nicht...

Der Präprozessor ist ziemlich dumm, und macht bei einem #define nichts anderes als ein "Search & Replace". Er ersetzt im Quellcode also nur jedes "PASSWORD_LEN" das er findet durch "sizeof(Password)-1".
Wenn der Compiler dann den so vorbereiteten Quellcode verarbeitet, kann er natürlich noch Optimierungen machen (z.B. konstante Ausdrücke vorberechnen), aber das macht er eh immer - egal ob mit oder ohne Präprozessor.

Aus diesem Grund kann es zu Problemen führen, wenn du in einer anderen Quelldatei als der in der du deinen String definiert hast, dessen Länge wissen möchtest. Denn der Compiler übersetzt jede Datei einzeln, und weiß daher nicht wie groß das Array tatsächlich ist. Das resultiert dann entweder in einer Fehlermeldung (Idealfall), einer Warnung (nicht so toll weil man sie ignorieren kann), oder er rechnet einfach mit den Informationen die er zur Verfügung hat (nämlich "Password hat den Typ char*, und der hat die Größe 4") was mit hoher Wahrscheinlichkeit ein völlig falsches Ergebnis liefert.