2016-08-11 3 views
2

Wann wird constexpr verwendet und wann wird extern const verwendet?'Constexpr' vs 'extern const'. Was hat Priorität?

Ich habe eine Situation wie:

  • in Header (H):

    extern const int MAX_NUMBER_OF_ROWS; 
    
  • in Quelle (CPP):

    const int MAX_NUMBER_OF_ROWS= 99; 
    

Die Dateien (Header und Source) enthält genau solche Definitionen und Deklarationen .

Ist es nur die constexpr in der Header-Datei zu verwenden, unverbindlichen und wird die Quelldatei zu befreien, wie hier in ?:

// this is in the header file. There is no cpp file any more. 
constexpr int MAX_NUMBER_OF_ROWS= 99; 
+7

Diese sind orthogonal - Sie hätten immer 'const int MAX_NUMBER_OF_ROWS = 99;' im Header verwenden können; und dann wäre die Frage, ob man "const" in "consxpr" umwandeln soll. Es so zu machen, wie Sie es haben, wird normalerweise nur gemacht, wenn der Wert nicht bekannt ist, wenn der Header eingeschlossen ist. –

+0

OK, und wenn es in der Kopfzeile ist, wie Sie gesagt haben, kann es "constexpr" sein, oder? – mtb

Antwort

11

Mit extern const in der Header-Datei sagt nur den Compiler, dass der Variable existiert und dass es nicht modifizierbar ist. Es teilt dem Compiler seinen Wert nicht mit, was bedeutet, dass es keine Kompilierzeitkonstante mehr ist. Wenn es keine Kompilierzeitkonstante ist, kann es nicht für z.B. case oder als eine Array-Größe.

von MM im Kommentar sagte A, entweder

const int MAX_NUMBER_OF_ROWS= 99; 

oder

constexpr int MAX_NUMBER_OF_ROWS= 99; 

direkt in der Header-Datei verwenden, und es wird ein Kompilierung-Konstante in allen Übersetzungseinheiten, die die enthalten sein Header-Datei.

+0

Die Frage ist jetzt: wann 'const int' und wann' consxpr int' in der Header-Datei zu verwenden? – mtb

+0

In C erhalten Sie Verknüpfungsfehler, wenn Sie 'const int MAX_NUMBER_OF_ROWS = 99;' im Header angeben und sie in mehrere Quelldateien einschließen. Ist das in C++ anders oder fehlt das in Ihrer Antwort? – user694733

+3

@ user694733 ja es ist anders in C++; 'const'-Variablen haben interne Verknüpfungen, sofern sie nicht mit' extern' deklariert sind (in der Definition oder in einer früheren Deklaration derselben Variable) –

3

constexpr ist besser, wenn Ihr Compiler dies unterstützt.

Es bewertet den Wert der Funktion oder Variable zum Zeitpunkt der Kompilierung, mit besserer Leistung (weniger Speicher suchen und lesen) und weniger Speicherkosten (nicht im Datenabschnitt vorhanden).

Allerdings unterstützen einige Compiler es nicht, zum Beispiel Visual Studio 2013 oder älter.

3

extern const kann verwendet werden, wenn Sie die Variable in Zukunft auf einen anderen Wert initialisieren möchten und nicht möchten, dass Codes, die diese Variable verwenden, neu kompiliert werden. (Ich habe dieses Bedürfnis nie gesehen, aber es könnte in bestimmten Fällen nützlich sein.) Wie andere gesagt haben, kann der Wert dieser Variablen nicht in konstanten Ausdrücken verwendet werden.

constexpr kann verwendet werden, wenn der Wert der Variablen zur Kompilierzeit bekannt ist.

+0

ein gutes Beispiel sind Versions-Strings. Wenn Sie cmake verwenden, um die aktuelle git-Revision in das Programm zu schreiben, wird es sich die ganze Zeit ändern, also nicht in der Kopfzeile –

Verwandte Themen