Neudefinition von Variablen für einzelne Header zu vermeiden

8

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?

    
Abhinav Gauniyal 12.09.2016, 12:54
quelle

2 Antworten

5

Sie könnten Ihre Variable zu einer lokalen statischen Variable in einer Funktion machen:

%Vor%     
Chris Drew 12.09.2016, 14:27
quelle
1
  

Gibt es Probleme mit einer der oben beschriebenen Möglichkeiten?

Makrotrick

  • Profis
    • Erzeugt eine minimale Anzahl von Variablen in Objektdateien. Sehen Sie sich den Anonymen Namespace an.
  • Nachteile
    • Sehr zerbrechlich. Beim Einschließen der Kopfzeile muss ein Programmierer wissen, ob beliebige anderer vorhandener Quellen die Variablendefinitionen enthalten. Das skaliert nicht gut, wenn die Anzahl der Quelldateien zunimmt.

Interne Verknüpfung (anonymer Namespace)

  • Profis
    • Hat nicht den Nachteil des Makrotricks.
  • Nachteile
    • Jede Objektdatei, die den Header enthält, hat ihre eigene Kopie der Variablen. Ich bin mir nicht sicher, aber die Variablen sind 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.

  • Profis
    • Erzeugt eine minimale Anzahl von Variablen in Objektdateien, wie der Makrotrick.
    • Hat nicht den Nachteil des Makrotricks.
  • Nachteile
    • None (es sei denn, Sie ziehen in Erwägung, eine separate Quelldatei zu verwenden, die von sich selbst stammt).
  

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.

    
user2079303 12.09.2016 14:19
quelle

Tags und Links