<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[namespace Problem]]></title><description><![CDATA[<p>Der Code ist auf drei Dateien verteilt:</p>
<p>Das hier ist als Header Gleit.h vorgesehen:</p>
<pre><code class="language-cpp">namespace Gleit{
#ifndef FEHLER
double fehler = 0.05f;
#define FEHLER
#endif

bool equal(float zahl_1, float zahl_2);

};
</code></pre>
<p>Bei dem #ifndef habe ich mir gedacht, dass der Header womöglich öftere Male in verschiedenen Modulen eingebunden werden könnte, und dann wäre ja die Variable fehler unerlaubter Weise mehrfach definiert.</p>
<p>bei der Implementierung der Funktion sieht die Datei so aus:</p>
<pre><code class="language-cpp">#include &quot;Gleit.h&quot;

namespace Gleit{

bool equal(float zahl_1, float zahl_2){
 return zahl_1 &lt; zahl_2 ? zahl_2-zahl_1 &lt; delta : zahl_1-zahl_2 &lt; delta;
}
};
</code></pre>
<p>Erhofft hätte ich mir von der Funktion, dass sich damit zwei Gleitzahlen vergleichen lassen, was ja bei == unzuverlässig ist. In einem main-Programm soll man dann einfach den 'fehler' so einstellen können, damit es für die Zwecke des konkreten Programmes dann genau genug ist.</p>
<p>Also habe ich eine TestMain geschrieben, um die Funktion auszuprobieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Gleit.h&quot;

using namespace std;
using namespace Gleit;

int main(){
fehler = 0.01f; // Sollte diesmal einen anderen erlaubten Fehler einstellen
if(eq(3.5f,3.509f))
 cout &lt;&lt; &quot;Identisch.&quot;
else
 cout &lt;&lt; &quot;Nicht identisch.&quot;

return 0;
}
</code></pre>
<p>Beim Kompilieren meldet mir VSC++, dass die Variable fehler angeblich mehrfach definiert ist, und deshalb ein fataler Fehler aufgetreten ist.<br />
Meine Hoffnungen, mittels des #ifndef Konstrukts eine mehrfache Definition der Variablen zu unterbinden, haben sich leider nicht erfüllt.</p>
<p>Liegt das nur an meinem Compiler, oder wie kann ich den Code so verändern, dass man den 'Fehler' später festlegen kann. Immerhin müssen ja auch die Dateien, in denen die Funktionen des namespaces implementiert werden, von der Existenz einer Variablen 'fehler' bereits wissen.</p>
<p>Mit Tipps wäre mir weitergeholfen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184489/namespace-problem</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 16:56:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184489.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Jun 2007 17:41:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to namespace Problem on Fri, 15 Jun 2007 17:41:04 GMT]]></title><description><![CDATA[<p>Der Code ist auf drei Dateien verteilt:</p>
<p>Das hier ist als Header Gleit.h vorgesehen:</p>
<pre><code class="language-cpp">namespace Gleit{
#ifndef FEHLER
double fehler = 0.05f;
#define FEHLER
#endif

bool equal(float zahl_1, float zahl_2);

};
</code></pre>
<p>Bei dem #ifndef habe ich mir gedacht, dass der Header womöglich öftere Male in verschiedenen Modulen eingebunden werden könnte, und dann wäre ja die Variable fehler unerlaubter Weise mehrfach definiert.</p>
<p>bei der Implementierung der Funktion sieht die Datei so aus:</p>
<pre><code class="language-cpp">#include &quot;Gleit.h&quot;

namespace Gleit{

bool equal(float zahl_1, float zahl_2){
 return zahl_1 &lt; zahl_2 ? zahl_2-zahl_1 &lt; delta : zahl_1-zahl_2 &lt; delta;
}
};
</code></pre>
<p>Erhofft hätte ich mir von der Funktion, dass sich damit zwei Gleitzahlen vergleichen lassen, was ja bei == unzuverlässig ist. In einem main-Programm soll man dann einfach den 'fehler' so einstellen können, damit es für die Zwecke des konkreten Programmes dann genau genug ist.</p>
<p>Also habe ich eine TestMain geschrieben, um die Funktion auszuprobieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Gleit.h&quot;

using namespace std;
using namespace Gleit;

int main(){
fehler = 0.01f; // Sollte diesmal einen anderen erlaubten Fehler einstellen
if(eq(3.5f,3.509f))
 cout &lt;&lt; &quot;Identisch.&quot;
else
 cout &lt;&lt; &quot;Nicht identisch.&quot;

return 0;
}
</code></pre>
<p>Beim Kompilieren meldet mir VSC++, dass die Variable fehler angeblich mehrfach definiert ist, und deshalb ein fataler Fehler aufgetreten ist.<br />
Meine Hoffnungen, mittels des #ifndef Konstrukts eine mehrfache Definition der Variablen zu unterbinden, haben sich leider nicht erfüllt.</p>
<p>Liegt das nur an meinem Compiler, oder wie kann ich den Code so verändern, dass man den 'Fehler' später festlegen kann. Immerhin müssen ja auch die Dateien, in denen die Funktionen des namespaces implementiert werden, von der Existenz einer Variablen 'fehler' bereits wissen.</p>
<p>Mit Tipps wäre mir weitergeholfen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306763</guid><dc:creator><![CDATA[Gruselcode]]></dc:creator><pubDate>Fri, 15 Jun 2007 17:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to namespace Problem on Fri, 15 Jun 2007 18:32:18 GMT]]></title><description><![CDATA[<p>#ifdef arbeitet ja nur pro übersetzungseinheit. wenn du dann zwei davon hast (aka zwei .cpp dateien), hast du auch deinen double zweimal drin. lösung: entweder du gibst deiner variable internal linkage (aber das würde ich dir nur bei konstanten empfehlen und da geht das automatisch) oder externe:</p>
<pre><code class="language-cpp">//dein header
namespace foo
{
   extern double deine_zahl;
}

//in *einer* .cpp datei dann
#include &quot;header&quot;

double foo::foo; //wahlweise auch mit einem default wert initialisieren
</code></pre>
<p>das solltest du wollen.</p>
<p>allerdings hast du ein problem damit, wenn du die variable in einer übersetzungseinheit initialisierst und sie in einer anderen noch im globalen namespace verwendest. dann könnte es nämlich sein, dass du die variable uninitialisiert verwendest (und das ist schlecht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1306789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1306789</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Fri, 15 Jun 2007 18:32:18 GMT</pubDate></item></channel></rss>