Statische Klassenvariablen oder doch globale?
-
Badestrand schrieb:
Naja, so kannst du das Kollisions-Risiko ausschließen, ist an sich ziemlich praktisch
Du meinst, falls in einem anderen Modul eine Definition mit dem gleichen Bezeichner vorkommt? Oder wie ist das zu verstehen?
-
Nexus schrieb:
Badestrand schrieb:
Naja, so kannst du das Kollisions-Risiko ausschließen, ist an sich ziemlich praktisch
Du meinst, falls in einem anderen Modul eine Definition mit dem gleichen Bezeichner vorkommt? Oder wie ist das zu verstehen?
Ja, genau. Zur Vermeidung kann man natürlich auch kryptische Bezeichner oder fiese Prefixe vergeben, ist bei dem einfachen anonymer-namespace-Workaround aber imo ziemlich unnötig.
-
Gut, danke. Hat ein anonymer Namensraum eigentlich gewisse Vorteile gegenüber
static
? Beide führen ja zu interner Linkage, oder worin besteht der Unterschied?
-
Ich kenne keinen Unterschied, verwende aber immer anonyme Namensräume um mir static für die "normalen" static-Fälle freizuhalten. Dass static internal Linkage bewirkt, hab ich auch erst vor etwa einem Jahr erfahren, da war ich gut überrascht
-
Nexus schrieb:
Gut, danke. Hat ein anonymer Namensraum eigentlich gewisse Vorteile gegenüber
static
? Beide führen ja zu interner Linkage, oder worin besteht der Unterschied?der nameless namespace (der richtig glaub ich unnamed heisst, aber ich mag nameless mehr weil es sich reimt
) hat NICHT internal linkage. was auch gut so ist. denn dadurch kann man klassen, die man in einem unnamed namespace definiert, als template parameter einsetzen.
der vorteil von unnamed namespaces ist ganz klar dass man alles reinstecken kann, also auch klassen. mit static kann man bloss variablen und funktionen machen, aber keine klassen. unnamed namespaces sind der "c++ way of doing it". static für globale variablen/funktionen gibt's im prinzip nurnoch zwecks kompatibilität mit C und mit älteren C++ versionen.
-
Vielen Dank für die Erläuterungen. Stimmt, ein anonymer Namensraum sollte sich bezüglich Linkage eigentlich gleich wie ein benannter verhalten. Dass man da alles reinpacken kann (auch Klassen), habe ich auch nicht bedacht, ist aber gut zu wissen.
Möchte nun noch jemand bestätigen, dass private statische Klassenvariablen im Normalfall sinnlos sind? Oder hat jemand ein Gegenargument? Mir fällt nämlich gerade echt keines ein...
-
Nexus schrieb:
Möchte nun noch jemand bestätigen, dass private statische Klassenvariablen im Normalfall sinnlos sind? Oder hat jemand ein Gegenargument? Mir fällt nämlich gerade echt keines ein...
Naja wa sis mit statischen Konstanten? Oder anderen internen Werten die nur die Klasse selbst braucht die aber nur einmal gebraucht werden und damit Platzsparender weise static intern abgelegt werden?
-
Xebov schrieb:
Naja wa sis mit statischen Konstanten? Oder anderen internen Werten die nur die Klasse selbst braucht die aber nur einmal gebraucht werden und damit Platzsparender weise static intern abgelegt werden?
Das ist alles auch mit globalen Variablen möglich, die in den entsprechenden .cpp-Dateien deklariert werden. Darum ging es ja die ganze Zeit...
-
Naja ... einzige Ausnahme die mir jetzt einfällt ist integrale private statische Konstanten (puh!), welche von friend Klassen verwendet werden.
-
Gut, danke.
friend
kommt bei mir eher selten vor (in meinem jetzigen Projekt gar nicht). Hmm, ich glaube, in nächster Zeit werde ich eher globale Variablen in .cpp-Dateien innerhalb anonymer Namensräume nutzen. Bis ich mir vielleicht eines Tages mal sage, es wäre halt doch schöner, die Variable würde zur Klasse gehören...P.S.:
hustbaer schrieb:
(puh!)
Warum hast du nicht "integrale private statische konstante Variablen" hingeschrieben? (Wegen des "Widerspruchs" konstante Variable? Oder hat dich das bereits genügend Schnauf gekostet?)...
-
Nexus schrieb:
P.S.:
hustbaer schrieb:
(puh!)
Warum hast du nicht "integrale private statische konstante Variablen" hingeschrieben? (Wegen des "Widerspruchs" konstante Variable? Oder hat dich das bereits genügend Schnauf gekostet?)...
Weiss nicht, wäre mir garnicht eingefallen dass man das schreiben könnte. Konstanten sind für mich halt Konstanten, und keine Variablen. Wenn dann hätte ich noch "integrale private statische konstante Member" geschrieben
-
Hm... Ich sag auch konstante Variablen, ist wohl Ansichtssache.
Und einigen wir uns doch auf "integrale private statische konstante Membervariablen".
Vielen Dank übrigens für die Hilfe!