Ich habe eine einzige Header-Anforderung für einen Code, was bedeutet, dass keine Deklarationen und Definitionen in separate Header- und Quelldateien aufgeteilt werden sollten. Ich habe es richtig implementiert und es funktioniert wie für meinen Anwendungsfall vorgesehen, wo diese Header-Datei in nur einer einzigen Quelldatei enthalten sein sollte.
Wenn es nun in mehreren Quellendateien verwendet wird (wo mehrere .cpp es enthalten), wird es mit dem Linker-Fehler in den Zeilen fehlschlagen, in denen einige Variablen neu deklariert werden. Das liegt daran, dass ich den Code wie -
habe %Vor%Nun wäre die beste Lösung, diese Variablen in der Header-Datei zu deklarieren und sie in einer einzelnen cpp-Datei zu definieren / zuzuweisen, aber wie gesagt, ich möchte dies mit einer einzigen Header-Datei machen können. Was zu dem Problem führt, dass, wenn mehrere Quelldateien es enthalten, wird es reklärungen geben.
Bisher bin ich mir nicht sicher, wie ich das schaffen könnte, aber ich habe zwei Ideen -
%Vor%Ich bin mir nicht so sicher, würde das überhaupt funktionieren?
Und die zweite Art, über die ich nachgedacht habe, ist, sie in einen anonymen Namespace zu stellen, ich probiere das hier aus und bis jetzt ist es erfolgreich -
%Vor%Gibt es eine andere Möglichkeit, dies zu erreichen? Gibt es Probleme mit einer der oben beschriebenen Möglichkeiten?
Sie könnten Ihre Variable zu einer lokalen statischen Variable in einer Funktion machen:
%Vor%Gibt es Probleme mit einer der oben beschriebenen Möglichkeiten?
Makrotrick
Interne Verknüpfung (anonymer Namespace)
const
und alle haben zur Laufzeit denselben Wert, der Linker kann die Duplikate wegwerfen. In jedem Fall ist der Unterschied für Ihr Programm nur ein paar Bytes wert. Das Ändern einzelner Variablen im Gegensatz zum Ändern einer gemeinsamen Variablen würde die Bedeutung des Programms ändern. Betrachten wir zum Vergleich die separate Quelldateioption, die Sie ausgeschlossen haben.
Gibt es eine andere Möglichkeit, dies zu erreichen?
Nicht wirklich. Sie können das Schlüsselwort static
anstelle des anonymen Namespace verwenden, um die interne Verknüpfung zu deklarieren.
PS. Wenn Sie im Header keine Nicht-Template-Funktionen definieren, müssen diese inline deklariert werden. Ihr anonymer Namespace-Beispiel schlägt das nicht vor.
Tags und Links c++ namespaces c++11 extern