K
Nexus schrieb:
krümelkacker schrieb:
Um das zu vermeiden, kann man es so machen, wie ich es oben bei constants::dings gezeigt habe.
Wieso ein Array und kein Zeiger mit externer Bindung?
Willkür.
Nexus schrieb:
nnnnnnnnnnn schrieb:
Und wenn man sie static macht? Bleibt das Problem der doppelten Stringkonstanten dann noch immer bestehen?
Natürlich, mit static sagt man ja explizit, dass interne Bindung erwünscht ist.
Mit anderen Worten: Ob ich auf Namensraum-Ebene
static const int foo = 23;
oder
const int foo = 23;
schreibe, macht keinen Unterschied, da C++ für konstante Objekt schon automatisch eine interne Bindung verwendet. Lässt man das const weg, macht es einen Unterschied, weil sonst externe Bindung für nicht-konstante Objekt automatisch verwendet wird. Daher habe ich abundzu auch extern verwendet, um externe Bindung bei const-Objekten zu erzwingen.
Ich habe gerade im C++ Standard folgendes entdeckt:
7.1.2/4 schrieb:
...A string literal in the body of an extern inline function is the same object in different translation units...
Diesen Fall hatte ich eigentlich auch getestet, aber die Zeichenkette ist trotzdem mehr als einmal in der ausführbaren Datei gelandet.
#ifndef KONSTANTEN
#define KONSTANTEN
inline char const* foo() {
return "superkalifragilistigexpialigetisch";
}
#endif
Es taucht doppel im Executable auf, aber die Adresse, die immer zurückgegeben wird, ist trotzdem die gleiche. Komisch. Scheint eine der zwei Stringkonstanten überflüssig zu sein.
Edit: Habe die letzten Tests nochmal mit clang++ statt g++ wiederholt. Und siehe da, ich finde keine doppelten Zeichenketten mehr im Exeucutable -- nicht mal mehr in dem Fall, wo ich eigentlich gedacht hatte, dass es zweimal auftauchen müsste.