2015-11-05 9 views
5

ich so eine einfache Kompilierung Zeitkonstante zum Beispiel verwenden möchten, definieren:Wie ein constexpr Variable

double foo(double x) { return x + kConstDouble; } 

Jetzt sehe ich zumindest die folgenden Möglichkeiten, um die konstante

namespace { static constexpr double kConstDouble = 5.0; } 
namespace { constexpr double kConstDouble = 5.0; } 
static constexpr double kConstDouble = 5.0; 
constexpr double kConstDouble = 5.0; 

zu definieren, die ist der richtige Weg? Gibt es einen Unterschied, wenn kConstDouble in einem Header vs. einer Quelldatei definiert ist?

+0

Alle vier sind in Ordnung und Sie könnten auch '#define kConstDouble 5.0' definieren –

Antwort

0

Wenn Sie einen statischen oder anonymen Namespace verwenden, wird die Variable intern verknüpft. Es ist nur innerhalb derselben Übersetzungseinheit sichtbar. Wenn Sie also eine dieser Dateien in einer CPP-Datei verwenden, können Sie die Variable nirgendwo anders verwenden. Dies würde typischerweise durchgeführt werden, wenn die Konstante ein Implementierungsdetail dieser Codeeinheit ist. Wenn Sie es anderen Übersetzungseinheiten zur Verfügung stellen möchten, müssen Sie es in eine Header-Datei einfügen. Der typische Weg, dies zu tun, wäre, es als statisch zu deklarieren (oder es in einen anonymen Namensraum zu setzen), da es eine triviale und konstante Variable ist. Der andere Ansatz wäre, es extern in der Kopfzeile zu deklarieren und es in der .cpp-Datei zu definieren, um eine wirklich globale Variable zu erhalten (im Gegensatz zu der obersten, wo eigentlich jedes tu eine eigene Kopie hat).

Zwischen statischem und anonymem Namespace; Nun, du brauchst nicht beide zuerst. Beide machen das gleiche AFAIK. Aber ich denke, es ist an dieser Stelle eher idiomatisch, anonyme Namespaces in cpp-Dateien zu verwenden, da sie verwendet werden können, um auch Funktionen, Klassen, etc. interne Verknüpfungen zu geben. Auf der anderen Seite, wenn Sie es verwenden möchten, um eine Variable global verfügbar zu machen, ist es üblich, statische zu verwenden; Ich verwende nie anonyme Namensräume in Header-Dateien, da ich es irreführend finde.

Verwandte Themen