Frage

Eine der Launen meines Entwicklungssystems (Codegar C ++ Builder) ist, dass einige der automatisch generierten Header darauf bestehen, ...

using namespace xyzzy

... Aussagen in ihnen, die sich auf meinen Code auswirken, wenn ich es am wenigsten möchte oder erwarte.

Gibt es eine Möglichkeit, wie ich eine vorherige "Anweisung" mit "Anweisung" irgendwie abbrechen/überschreiben kann, um dies zu vermeiden?

Vielleicht...

unusing namespace xyzzy;
War es hilfreich?

Lösung

Nö. Aber es gibt eine potenzielle Lösung: Wenn Sie Ihre Richtlinie in einen eigenen Namespace einschließen, wie diese ...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

... dann werden die Auswirkungen der Verwendung von Richtlinien innerhalb dieses Headers neutralisiert.

Das könnte in einigen Fällen problematisch sein. Deshalb empfiehlt jeder C ++ - Style Guide dringend nicht Einfügen einer "Namespace" -Direktive in einer Header -Datei.

Andere Tipps

Nein, du kannst nicht nicht verwendet ein Namespace. Das einzige, was Sie tun können, ist, das zu setzen using namespace-Einen Block, um den Umfang zu begrenzen.

Beispiel:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Vielleicht können Sie die Vorlage ändern, die von Ihren automatisch generierten Headern verwendet wird.

Möglicherweise stecken Sie mit expliziten Namespaces für Konflikte fest:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

Als zukünftige Referenz: Seit der XE -Version gibt es einen neuen Wert, den Sie #definieren können, um die gefürchteten zu vermeiden using namespace System; Int die inklusive: delphiHeader_no_implicit_namespace_use

Wie wäre es mit SED, Perl oder einem anderen Befehlszeilen-Tool als Teil Ihres Build-Prozesses, um die generierten Header nach ihrer Erstellung zu ändern, aber bevor sie verwendet werden?

Schnelles Experiment mit Visual Studio 2005 zeigt, dass Sie diese Header in Ihrem eigenen Namensnamen und dann in Ihren eigenen Namensbereich einschließen können use Was Sie aus diesem Namespace brauchen (aber nicht use Der gesamte Namespace, wie er den Namespace einführt, den Sie verbergen möchten.

#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top