Wie kann man vermeiden, erneut deklariert werden versehentlich globale Konstanten in C ++?

StackOverflow https://stackoverflow.com/questions/642539

  •  22-07-2019
  •  | 
  •  

Frage

Ich habe eine Klasse Templatmatrix Klasse in einem Header definiert als "Matrix.h".

Einige Matrizen werden wiederholt in meinem Programm verwendet. Ich dachte, dass ich diese in der „Matrix.h“ Header-Datei definieren würde, etwa so:

const Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);

Als ich tun, um dieses g ++ beschwert sich, dass ich die Konstante in Frage neu definiert. Dies geschieht, weil ich Matrix.h in zwei verschiedenen Quelldateien enthalten. Wenn die Objektdateien für diese kompiliert werden, enden beide oben mit einer Definition der Matrix auf, die Fehlermeldung verursacht.

Meine Frage ist, wie kann ich diese Situation vermeiden? Ich mag eine Konstante, die mehr als eine Datei zugänglich ist, aber ich weiß nicht, wo es zu setzen.

War es hilfreich?

Lösung

Wenn Sie nicht möchten, dass es zwischen einem Header und Implementierungsdatei aufzuteilen,

  1. Erklären Sie Ihre Konstante static (oder in anonymen Namespace deklarieren) definitions privat zu machen. Linkers nicht beschweren, aber es wird in mehreren privaten Kopien über Übersetzungseinheiten hinweg führen.

    static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
    
  2. Machen Sie eine Inline-Funktion, die die Konstante zurückgibt. Inline-Funktionsdefinitionen erzeugen „schwach“ Symbole in Objektdatei, so wird Linker beseitigen Duplikate und eine auswählen.

    inline const Matrix<GLfloat>&
    GET_B_SPLINE_TO_BEZIER_MATRIX() {
        const static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
        return B_SPLINE_TO_BEZIER_MATRIX;
    }
    

Andere Tipps

Sie vermeiden durch:

  • Deklarieren es im Header extern. Ein Symbol kann beliebig oft deklariert werden.
  • es bei der Umsetzung definieren, nur einmal.

Sie einfach Ihre Header-Datei wie folgt schreiben

#ifndef HEADER_FILE_NAME_H

#define HEADER_FILE_NAME_H

// Ihre Header-Datei Code

#endif

Dies wird sicherstellen, dass es nicht mehrfach erklärt bekommen

Wrap-Header-Dateien (.h) in Präprozessor conditionals sie daran zu hindern in dem Symbol der Compiler-Tabelle zweimal enthalten ist:

#ifndef HEADER_NAME
#define HEADER_NAME
// code...
#endif//HEADER_NAME

HEADER_NAME kann wirklich alles sein, aber es ist am besten, um sicherzustellen, dass es in die Datei im Zusammenhang etwas mehr Kollisionen zu vermeiden, da dies nur einen leeren Präprozessormakro definieren (die auch in der Symboltabelle endet).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top