Wie funktionieren nicht-integrale Konstanten in C ++?

8

Ich weiß also, dass Konstanten in C ++ standardmäßig eine andere Verknüpfung als Variablen erhalten. Deshalb darf ich nicht

setzen %Vor%

in einer Kopfzeile - der Linker wird sich zu Recht über mehrere Definitionen beschweren. OTOH, ich kann schreiben

%Vor%

in einem Header, und der Compiler stellt sicher, dass es nur eine Definition von bar gibt.

Mit Integralkonstanten ist es einfach zu sehen, wie der Compiler damit umgeht - zumindest solange niemand die Adresse von bar annimmt oder irgendeine andere lustige Sache tut, die es benötigt, Speicher dafür zu vergeben. Was aber, wenn jemand es tut? Und was, wenn es kein Integral ist, sondern etwas, das zur Laufzeit Code ausführen muss? Angenommen, ich füge das in eine Kopfzeile ein:

%Vor%

Wenn keine kleinen Stringoptimierungen vorausgesetzt werden, muss zur Laufzeit dynamischer Speicher zugewiesen werden, so dass der Code ausgeführt werden muss, die Adresse irgendwo gespeichert werden muss usw.

Ich nehme an, dass ich dann mit einer Definition von baz pro Übersetzungseinheit enden würde, nur dass der Compiler eine interne Verknüpfung zu ihm gibt, um zu verhindern, dass sich der Linker beschweren kann? Oder fehlt mir etwas?

Hinweis: Ich bin nicht interessiert an constexpr , nur in einfachen alten C ++ Konstanten, wie sie seit den 80er Jahren existierten und waren kodifiziert in C ++ 98. (Wenn jedoch eine umfassende Antwort beinhalten würde, wie dies alles mit constexpr zusammenpasst, würde ich mich darüber nicht beklagen.)

    
sbi 16.07.2014, 13:31
quelle

1 Antwort

4

Das Deklarieren eines Objekts (im Namespace-Bereich) als const in C ++ weist ihm standardmäßig eine interne Verknüpfung zu.

Wenn Sie deklarieren (und wegen der Initialisierung definieren)

%Vor%

In eine Kopfzeile erhalten Sie eine statisch verknüpfte Zeichenfolge pro Übersetzungseinheit. Die Adresse müsste in jeder Übersetzungseinheit gespeichert werden (unterschiedliche Adressen für verschiedene Nicht-Heap-gespeicherte Zeichen - Nur-Lese-Speicher)

Edit: Als eine C ++ 11 Digression constexpr impliziert const , da es " geeignet für die Auswertung von konstanten Ausdrücken " bedeutet, also sollte es auch eine interne Verknüpfung haben. [Nb. Ich erwähne C ++ 14 nicht]

    
Marco A. 16.07.2014, 13:39
quelle

Tags und Links