Sorry für diese dumme Frage, aber gibt es eine Möglichkeit, using
Direktiven auf die aktuelle Datei zu beschränken, so dass sie nicht auf die Dateien, die #include
diese Datei weitergeben?Beschränkung `using` Direktiven auf die aktuelle Datei
Antwort
Vielleicht könnte das Umschließen des einzubeziehenden Codes in seinem eigenen Namespace das gewünschte Verhalten
erreichen, da sich Namensräume auf den Umfang auswirken.
// FILENAME is the file to be included
namespace FILENAME_NS {
using namespace std;
namespace INNER_NS {
[wrapped code]
}
}
using namespace FILENAME_NS::INNER_NS;
und in einer anderen Datei
#include <FILENAME>
// std namespace is not visible, only INNER_NS definitions and declarations
...
Hey, cooler Trick! Ich denke, ich werde für diesen gehen; Danke vielmals! :) – missingfaktor
Nein, das ist nicht der Fall, weshalb Sie keine Direktiven in Header-Dateien oder anderen Dateien verwenden sollten, die Sie enthalten.
Um dies ein wenig zu erweitern - der Präprozessor (der '# include' und andere #' - Befehle handhabt) wird ausgeführt, bevor der Compiler den Code jemals sieht. Die 'using'-Direktive und andere Standardschlüsselwörter werden vom Compiler verarbeitet. Was den Compiler anbelangt, sind die Header-Dateien also eigentlich keine separaten Dateien - sie sind Code, der sich in jeder Datei befindet, in der sie enthalten sind, also auch "using" Direktiven, die du vielleicht hineinlegst. – Amber
Aah ... traurig. Danke für die Antwort trotzdem. – missingfaktor
@Rahul Es ist nicht so schlimm - Sie können (und sollten) natürlich 'using' Direktiven in Ihren .cpp Dateien verwenden. –
Technisch Sie sollten sie bis zu einem gewissen internen Namespace importieren und dann die Dinge in dieser sichtbar für den Anwender bedeutet im Namensraum deklariert machen können.
#ifndef HEADER_HPP
#define HEADER_HPP
#include <string>
namespace my_detail
{
using std::string;
inline string concatenate(const string& a, const string& b) { return a + b; }
}
namespace my_namespace
{
using my_detail::concatenate;
}
#endif
#include <iostream>
#include "header.hpp"
using namespace my_namespace;
int main()
{
std:: //required
string a("Hello "), b("world!");
std::cout << concatenate(a, b) << '\n';
}
Nicht sicher, ob es der Mühe wert ist und wie es gut spielt mit „-Argument abhängigen Lookup“.
Zu viel Mühe in der Tat. Aber immer noch eine nette Arbeit. Also, +1. :) – missingfaktor
Sie können jedoch die Verwendung von Direktiven auf einen Nicht-Dateibereich beschränken, z. B. auf einen Namespace oder eine Funktion. –
Es ist viel besser, die 'using'-Direktive nicht in Headern anzuwenden. –
@David: Ich hasse es etwas wie 'std :: map>' wenn ich 'map >' eingeben kann . –
missingfaktor