Ich habe einige mathematische Funktionen neu definiert (so dass sie schneller sind - also weniger genau - oder Vorlagen verwenden). Ich stelle diese Funktionen in einen Namensraum und sie funktionieren gut.
Es passiert oft, dass ich vergessen habe, Funktionen aus meinem Namensraum aufzurufen (zB: Ich vergesse, mymath::cos
oder using mymath::cos;
zu schreiben, wenn ich cos
aufrufen will), und es ist ziemlich schwierig herauszufinden, wo Ich habe es vergessen (bis jetzt habe ich es nur durch Profiling herausgefunden).
Gegeben das
math.h
oder cmath
in meinem Math-Header und das Gibt es einen portablen Weg, die Standardmathematikfunktion zu verbergen , so dass ein Kompilierfehler gemeldet wird, wenn globale Namespace (dh: ohne Namespace) mathematische Funktionen verwendet werden?
Eine Lösung könnte ein using namespace mymath;
am Ende meiner Mathheader-Datei einfügen, aber diese Lösung scheint nicht so toll zu sein: Sie bricht den ganzen Zweck von Namespaces; Ich würde es vorziehen, explizit sagen zu müssen, ob ich eine Funktion von mymath
oder von std
verwenden soll, so dass ich gezwungen bin, zwischen einer Fester- oder einer präziseren Funktion zu wählen, ohne das Risiko einzugehen.
BEARBEITEN :
Viele Antworten sagen, dass, wenn ich cos
aus dem globalen Namespace verwende (ohne std
oder mymath
) und cmath
(und nicht math.h
), die Kompilierung fehlschlägt.
Ich weiß nicht, was der Standard dazu sagt, aber:
%Vor% kompiliert fein mit GNU GCC ( g++
) 4.5.1 (und älteren Versionen).
Müssen Sie die Header math.h und cmath direkt in Ihre Header-Datei einfügen? Wenn es nötig ist, versuchen Sie, den Header wie folgt einzufügen:
%Vor%Dies wird alle Definitionen von math.h in einem neuen Namespace enthalten, damit Sie sie nicht versehentlich an anderer Stelle verwenden.
Dies ist keine ideale Lösung. Vielleicht gibt es einen besseren Weg, dies mit anonymen Namensräumen zu tun, aber die Lösung ist mir nicht klar.
Leider ist die robusteste Lösung, nicht die gleichen Funktionsnamen wie die Standardbibliothek zu verwenden. Glücklicherweise sind die Standardfunktionsnamen kurz und stark abgekürzt, sodass Namen wie cosine()
, sine()
, exponent()
, arctan()
eindeutig (und wohl besser) wären, ohne den Namen mit plumpen Präfixen schmücken zu müssen.
Alternativ können Sie die gleichen Namen behalten, aber sie groß schreiben: Sin()
, Cos()
, Exp()
etc.
Wie wäre es mit dieser Idee: nach dem Einfügen von & lt; math.h & gt; verwenden Sie define wie folgt:
%Vor%Was passiert ist, dass jede Sünde durch Blahblahblah ersetzt wird, was einen Fehler verursachen wird. Aber was passieren wird ist, dass mymath :: sin durch mymath :: blahblahblah ersetzt wird (weil #define wörtlich funktioniert), so dass es auch einen Fehler erzeugt. In diesem Fall, wenn Sie die Aufgabe einfacher für Sie machen möchten, definieren Sie einfach die Funktion blahblahblah in mymath, um Fehler für mymath :: sin zu vermeiden, dann kompilieren Sie und beheben Sie alle diese Fehler.
Ich würde jedoch empfehlen, nur "Find in Files" zu machen und alle Funktionen durchzugehen, und ich bin mir sicher, dass es bei einem sehr großen Projekt nicht länger als eine Stunde dauern wird.
Ich hoffe, das hilft.
Grüße, Rafid
Schreiben Sie einige Wrapper-Funktionen in eine separate Datei.
%Vor%Oder so ähnlich. Verwenden Sie dann nur die in Ihren anderen Dateien und fügen Sie diese nicht in die anderen Quelldateien ein. Ja, es ist ein kleiner Schmerz, Forwarding-Funktionen für sie alle zu schreiben, aber es ist nur ein einzelner Job und es gibt nicht so viele ...
Mit einem modernen Compiler, der die Timecode-Generierung verknüpft und über Objektdateien inline laufen kann, sollte dies nicht ineffizient sein ...
Clifford ist meine bisher beste Antwort, aber es gibt noch eine Alternative, die Sie sich vorstellen können: Ändern Sie die Standard-Header für dieses Projekt (nur).
Es sollte eine Option bei Ihrem Compiler Ihrer Wahl geben, um anzugeben, wo die Standardbibliothek liegt. Daher können Sie die STL in Ihrem Projekt duplizieren und die Dateien so ändern, dass die beanstandeten Namen nicht mehr in den globalen Namensraum eingefügt werden / p>
Es ist hackisch, aber das ist der einzige Weg, an den ich denken kann, ohne den Code mit einem Skript zu überprüfen, wenn cos
/ sin
nicht qualifiziert ist (dh unmittelbar vor ::
).
Tags und Links math c++ namespaces scope header