Generische Programmierung
-
Hallo,
habe mir in einer Header-Datei ein paar zeilen zusammengeschrieben, um je nach kompilierung
std::coutoderstd::wcoutzu verwenden.#include <iostream> #ifdef UNICODE std::basic_ostream<wchar_t>& tcout = std::wcout; std::basic_ostream<wchar_t>& tcerr = std::wcerr; std::basic_ostream<wchar_t>& tclog = std::wclog; std::basic_istream<wchar_t>& tcin = std::wcin; #else std::basic_ostream<char>& tcout = std::cout; std::basic_ostream<char>& tcerr = std::cerr; std::basic_ostream<char>& tclog = std::clog; std::basic_istream<char>& tcin = std::cin; #endifProblem: wenn ich diese Datei mehrfach includiere, dann sagt der Linker logischerweise ständig, dass die Variablen schon ein paar mal in anderen Objektdateien vorkommen.
Wie kann ich dieses Problem umgehen?
Ist mein Ansatz für solche generischen cout/wcout geschichten soweit in Ordnung, oder würdet ihr das völlig anders machen?
-
Benutze im Header
externund nur die Deklaration. In einer CPP-Datei definierst du die Referenzen dann.
-
http://en.wikipedia.org/wiki/Include_guard
koennte dir helfen.mfg,
julian
-
#ifndef HEDAER_NAME
#define HEADER_NAME//Hier header inhalt
#endif
-
geht im header extern davor und in der *.cpp das ohne extern?
edit: uih, bin ich langsam.
-
superman! schrieb:
#ifndef HEDAER_NAME
#define HEADER_NAME//Hier header inhalt
#endif
Leider nicht, das Problem liegt beim Linker.
volkard schrieb:
geht im header extern davor und in der *.cpp das ohne extern?
Ja, sollte gehen. Man darf aber auch bei der Definition noch
externhinschreiben, soweit ich mich erinnern kann, ist es in gewissen Kontexten sogar nötig (wegen der Speicherklasse).Edit: @volkard: Post wahrscheinlich falsch aufgefasst.

-
Danke

Das Problem waren übrigens nicht die "Include-Guards" sondern das Problem trat auf, wenn die Referenzen in verschiedene .cpp-Dateien includiert wurden.
Das mit extern geht also