2013-08-03 18 views
10

Manyotherquestions beschäftigen Sie sich damit, wie Sie eine Variable zuweisen, indem Sie sie in einer Headerdatei deklarieren und in einer CPP-Datei definieren (zuordnen).Deklarieren und definieren Sie statische Variable in C++ Header?

Was ich tun möchte, ist keine .cpp-Dateien für meine Klasse zu verwenden, und alle Funktionen als Inline (in der Header-Datei) zu definieren. Das Problem, auf das ich stoße, ist, wie man statische Member-Variablen definiert, so dass selbst dann, wenn die .h-Datei in mehreren Kompilierungseinheiten enthalten ist, der Linker-Fehler "erster hier definiert" nicht auftritt.

Ich bin offen für Präprozessor Hacks, etc., wenn es die Arbeit erledigt. Ich möchte nur alle CPP-Dateien vermeiden.

Wenn es darauf ankommt, verwende ich GCC.

+0

Sie deklarieren Ihre Variable einfach als 'statisch'. Eine neue Instanz der Variablen wird in jeder Übersetzungseinheit erstellt, in die Sie die Header-Datei einfügen. Bei der Verknüpfungszeit werden jedoch keine Konflikte auftreten, da die Objekte über statische Verknüpfungen verfügen. –

+0

Nein, statische Datenelemente haben eine externe Verknüpfung. – jrok

+0

"Definieren (Zuweisen)": ** Definieren ** und ** Zuweisen ** sind zwei verschiedene Dinge. –

Antwort

13

Sie die Singletonmuster missbrauchen können, wenn man wirklich jede CPP muß vermeiden, Dateien:

class Foo { 
    public: 
     static Bar& getMyStatic() { 
      static Bar bar; 
      return bar; 
     }; 
}; 

Dies funktioniert, weil jetzt die Variable eine statische Variable innerhalb einer Funktion ist, und static hat in einem Funktionskontext eine andere Bedeutung als in einem Klassenkontext. Und für Funktionen erkennt der Linker mehrere identische Definitionen und wirft die Kopien weg.

Aber ich würde natürlich davon abraten, .cpp-Dateien zu vermeiden: Es bedeutet, dass Sie in eine Situation geraten, in der Sie das gesamte Programm oder zumindest große Teile davon in einem großen Stück zusammensetzen müssen. Jede Änderung, die Sie vornehmen, erfordert einen vollständigen Neuaufbau, der Ihren Änderungs-Compile-Testzyklus erheblich verlangsamt. Für sehr kleine Projekte, die kein Problem darstellen, aber für mittlere bis große Projekte.

+0

Dies scheint der beste (und einzige) Weg zu sein, statische Variablen in einer CPP-Datei zu vermeiden. Wie zur Kompilierzeit: mein kompilierter Code ist auf 32 KB begrenzt, so dass eine obere Schranke wie lange dauert. – srlm

-1

Solange Sie diese Headerdatei nur einmal in Ihrem gesamten Projekt einschließen, sind Sie in Ordnung. Dies ist jedoch eine ziemlich starke Anforderung, und es kann schwierig sein, andere dazu zu bringen, sich daran zu halten.

Sie könnten eine static Variable haben, aber das bedeutet, dass Sie mehr als eine für das gesamte Programm haben, was wichtig ist oder nicht (bedenken Sie, dass Sie es in Zukunft nicht ändern können, damit Sie haben, was ist bekannt als "latenter Fehler" - Sie ändern einen anderen Code, und plötzlich haben Sie einen neuen Fehler erstellt, weil die Variable keine Variable ist.

+1

Problem ist, dass es nicht beginnen kann, dass es wichtig ist, aber in der Zukunft kann es tun, und Sie versehentlich einen Fehler einführen –

+0

Absolut, das ist ein guter Punkt. –

0

Bei statischen Variablen müssen Sie eine .cpp-Datei einfügen, um die Möglichkeit mehrerer statischer Variablen zu vermeiden, wenn nur die eine beabsichtigt ist. Außerdem ist es keine gute Idee, große Inline-Methoden zu verwenden, da es nur ein Hinweis auf den Compiler ist, aber auch die Kompilierung länger dauert (Sie ändern einige dieser Funktionen in der Entwicklung und dann müssen viele abhängige Dateien kompiliert werden!)

Allerdings, wenn Sie in ihm viele CPP-Dateien mit nur wenige Statik nicht wollen, warum nicht nur eine Datei hat, sie zu speichern in.

Verwandte Themen