Generische Programmierung
-
Hallo,
habe mir in einer Header-Datei ein paar zeilen zusammengeschrieben, um je nach kompilierung
std::cout
oderstd::wcout
zu 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; #endif
Problem: 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
extern
und 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
extern
hinschreiben, 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