2016-10-30 3 views
0

ich Konstanten setzen wie:Wohin mit C++ Konstanten? In einer getrennten/freigegebenen Kopfzeile (main.h)?

const QString DATETIME_FORMAT  {"yyyy-MM-dd hh:mm:ss.zzz"}; 

in einer separaten Datei, main.h. Eigentlich habe ich es auf einem Namespace wie:

namespace projectx { 
    const QString DATETIME_FORMAT  {"yyyy-MM-dd hh:mm:ss.zzz"}; 
} 

Und dann, wenn ich DATETIME_FORMAT verwenden möchten Ich muss:

#include "../../main.h" 
using namespace projectx; 

Je nachdem, wo die Datei main.h mit befindet sich der Pfad ../../main.h ändern. Das ist ein bisschen nervig.

Ist dieser Ansatz standart? Was ist die Alternative?

+1

Legen Sie sie wo immer sie benötigt werden. Setzen Sie sie nicht dort aus, wo sie nicht sind. – DeiDei

+2

"const" -Objekte im Namespace-Bereich sind standardmäßig "statisch", sodass ein separates Objekt in jede TU eingefügt wird, die den Header enthält (der dann vom Linker in ein einzelnes Objekt optimiert werden kann). **_Nicht ideal. – ildjarn

+0

Was bedeutet TU? – KcFnMi

Antwort

1

Alternative ist zu verwenden extern Schlüsselwort. Schließen Sie die Definition der Konstanten in die Datei main.cpp und die externe Deklaration in main.h ein. Dieser Ansatz generiert eine zusätzliche Datei main.cpp, aber Sie haben nur eine Instanz der Konstante über alle Übersetzungseinheiten. Zum Beispiel, wenn Sie const int year = 2016 in project.cpp (alle Dateien in einem Verzeichnis) enthalten:

$cat main.cpp 
    const int year = 2016; 
    $cat main.h 
    extern const int year; 
    $cat project.cpp 
    #include "main.h" 
    int main() 
     { 
     ... 
    $gcc main.cpp project.cpp -o project -Wall -std=c++11 

Es gibt eine wichtige Nuance: Wenn Sie straighforward Definition const int year = 2016 in Header verwenden, mehr Einschlüsse dieser Datei generieren Fehler, aber Sie können extern const int year viele Male erklären, und es ist gültig. Sie können mehr über extern in this question lesen.

Dateien, die sich im Compiler-Suchpfad befinden, können ohne Schreibpfad enthalten sein. Wenn sich in GNU/Linux die Datei main.h in /usr/include befindet, können Sie sie einfach unter #include <main.h> (mehr Info here) einfügen.

Wenn Sie main.h Dateipfad zu QT-Umgebung speichern möchten, ist here Antwort auf Ihre Frage.