C ++: einige Funktionen ausblenden

8

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

  • I nur enthält die Standardköpfe math.h oder cmath in meinem Math-Header und das
  • Ich muss Standard-Mathe-Header einfügen (weil einige meiner Funktionen nur Wrapper für Standard 1 sind und ich möchte, dass sie inline sind oder sie Vorlagen sind),

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).

    
peoro 11.12.2010, 11:20
quelle

7 Antworten

4

Fügen Sie dies in eine Header-Datei ein und schließen Sie sie überall ein:

%Vor%     
TonyK 11.12.2010, 11:54
quelle
3

Wenn Sie nur cmath und nicht math.h einbeziehen, sollten sich alle Funktionen dieses Headers im std :: -Namespace befinden. Benutze niemals using namespace std; und es wird dir gut gehen. ( cmath ist nur math.h mit allen Dingen in einem Namespace)

    
ltjax 11.12.2010 11:22
quelle
2

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.

    
River 11.12.2010 11:33
quelle
2

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.

    
Clifford 11.12.2010 11:48
quelle
1

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

    
Rafid 11.12.2010 11:30
quelle
1

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 ...

    
jcoder 11.12.2010 11:48
quelle
0

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 :: ).

    
Matthieu M. 11.12.2010 12:50
quelle

Tags und Links