#define Anweisungen in einem Namespace
Wenn ich eine #define-Anweisung in einem namespace als solche:
namespace MyNamespace
{
#define SOME_VALUE 0xDEADBABE
}
Bin ich richtig zu sagen, dass die #define-Anweisung ist nicht eingeschränkt auf den Namensraum?
Ist die nach der "richtigen" Sache zu tun?
namespace MyNamespace
{
const unsigned int SOME_VALUE = 0xDEADBABE;
}
InformationsquelleAutor der Frage Soo Wei Tan | 2009-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Richtig,
#define
's sind nicht gebunden durch namespaces.#define
ist ein Präprozessor Richtlinie - es führt zu manipulation der Quell-Datei vor der Kompilierung über den compiler. Namespaces werden während der Kompilierung Schritt und der compiler hat keine Einsicht in die#define
's.Sollten Sie versuchen zu vermeiden, den Präprozessor so viel wie möglich. Für Konstante Werte wie diese, bevorzugen const über
#define
's.InformationsquelleAutor der Antwort Michael
Ich Stimme völlig mit den Kommentaren auf der Verwendung von Konstanten und der Umfang wird unbegrenzt für
#define
s.Jedoch, wenn Sie do verwenden Präprozessor
#define
Linien, bitte decken Sie Sie richtig für die erwarteten Umfang,Warum
#defines
?Ich kenne einen Fall, wo ein embedded-Plattform nicht unterstützt-Konstanten im code.
Es gab keine Möglichkeit, Sie zu initialisieren...
Es hilft immer, um besser zu Lesen.
InformationsquelleAutor der Antwort nik
Den Präprozessor arbeitet (konzeptionell mindestens, und oft eigentlich auch), bevor namespaces und andere Sprache-level-Konzepte "kick-in" -- also ja, es ist definitiv viel besser die Sprache zu verwenden-level-Konstrukte wie
const
Werte, wo immer Sie können!InformationsquelleAutor der Antwort Alex Martelli
Ja. Im Allgemeinen, die Verwendung von const-Werten anstelle von #define würd Werte hat viele Vorteile. Beschränken Sie den Gültigkeitsbereich der Variablen ist einer der Vorteile. Der Geltungsbereich kann eingeschränkt werden, um einen namespace, oder irgendwelche anderen gültigen Geltungsbereich diese Weise (auch in der Klasse, Funktion, level, etc.).
InformationsquelleAutor der Antwort Reed Copsey
Wenn, aus irgendeinem Grund, konnte Sie nicht ändern Sie im zweiten Fall bin ich mir ziemlich sicher, dass Sie haben, um Pflege zu kompilieren MyNamespace in einem eigenen Objekt und verknüpfen Sie die Objekte einzeln (oder vielleicht einfach führen Sie den Präprozessor auf, dass die einzigen namespace von selbst). Der C++ - Präprozessor sollte
#define
Anweisung und im wesentlichen einen string ersetzen überalldassSOME_VALUE
gesehen in den source-code. Daher, wenn der Präprozessor ist nicht bekannt, die#define
SOME_VALUE
können nicht ersetzt werden, die in einem anderen source-Datei.InformationsquelleAutor der Antwort Mark Rushakoff