<?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[Funktion bereits in Application.obj definiert]]></title><description><![CDATA[<p>Hi,</p>
<p>Habe wieder Mal so einen Standardfehler. Ich gebe erstmal Pseudocode an, der hoffentlich alles wichtige darstellt. Reicht das nicht, schieb ich hier andren Code rein. Also ich benutze Visual C++ 2008 Express Edition und habe ne Datei header.hpp (ich benutze überall .hpp und hoffe, dass das keinen Unterschied macht):</p>
<pre><code>#ifndef EXCEPTIONS_
#define EXCEPTIONS_

// ein paar includes wie iostream oder string

namespace ns
{

   class Exception
   {
   [...]
   };

   std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Exception&amp; exc)
   { ... }

}

#endif
</code></pre>
<p>Diese header.hpp wird mehrfach von verschiedenen Stellen eingebunden. Jeder Header einer erbenenden Klasse bindet sie beispielsweise ein. Somit geschieht jedes Mal ein Include dieses Headers innerhalb eines Headers. Form ist folgende:</p>
<pre><code>#ifndef BLABLA_
#define BLABLA_

#include &quot;header.hpp&quot;

namespace ns
{
  class SpecialException : public Exception
 { [...] };
}

#endif
</code></pre>
<p>Und die einzelnen Exceptions werden dann natürlich in entsprechenden cpp-Dateien eingebunden (und auch in verschiedenen Headern, welche z.B. Implementierungen von statischen Methoden haben, welche ne Exception nutzen).</p>
<p>Fehlermeldung:</p>
<pre><code>1&gt;WindowsWindow.obj : error LNK2005: &quot;class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp; __cdecl Exceptions::operator&lt;&lt;(class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp;,class Exceptions::Exception &amp;)&quot; (??6Exceptions@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@AAVException@0@@Z) ist bereits in Application.obj definiert.
</code></pre>
<p>Exceptions ist in diesem Fall der Namespace, hätte ich eigentlich auch direkt so benennen können.</p>
<p>Wo liegt das Problem, Ideen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244191/funktion-bereits-in-application-obj-definiert</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 12:15:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244191.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Jun 2009 13:06:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Fri, 26 Jun 2009 13:11:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Habe wieder Mal so einen Standardfehler. Ich gebe erstmal Pseudocode an, der hoffentlich alles wichtige darstellt. Reicht das nicht, schieb ich hier andren Code rein. Also ich benutze Visual C++ 2008 Express Edition und habe ne Datei header.hpp (ich benutze überall .hpp und hoffe, dass das keinen Unterschied macht):</p>
<pre><code>#ifndef EXCEPTIONS_
#define EXCEPTIONS_

// ein paar includes wie iostream oder string

namespace ns
{

   class Exception
   {
   [...]
   };

   std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Exception&amp; exc)
   { ... }

}

#endif
</code></pre>
<p>Diese header.hpp wird mehrfach von verschiedenen Stellen eingebunden. Jeder Header einer erbenenden Klasse bindet sie beispielsweise ein. Somit geschieht jedes Mal ein Include dieses Headers innerhalb eines Headers. Form ist folgende:</p>
<pre><code>#ifndef BLABLA_
#define BLABLA_

#include &quot;header.hpp&quot;

namespace ns
{
  class SpecialException : public Exception
 { [...] };
}

#endif
</code></pre>
<p>Und die einzelnen Exceptions werden dann natürlich in entsprechenden cpp-Dateien eingebunden (und auch in verschiedenen Headern, welche z.B. Implementierungen von statischen Methoden haben, welche ne Exception nutzen).</p>
<p>Fehlermeldung:</p>
<pre><code>1&gt;WindowsWindow.obj : error LNK2005: &quot;class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp; __cdecl Exceptions::operator&lt;&lt;(class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp;,class Exceptions::Exception &amp;)&quot; (??6Exceptions@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@AAVException@0@@Z) ist bereits in Application.obj definiert.
</code></pre>
<p>Exceptions ist in diesem Fall der Namespace, hätte ich eigentlich auch direkt so benennen können.</p>
<p>Wo liegt das Problem, Ideen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733312</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 26 Jun 2009 13:11:05 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Fri, 26 Jun 2009 16:58:11 GMT]]></title><description><![CDATA[<p>Hmm. Ich würde mal vermuten, dass etwas mit den Includeguards falsch läuft.. Sicher, dass da keine Schreibfehler drinn sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733416</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 26 Jun 2009 16:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Fri, 26 Jun 2009 22:15:36 GMT]]></title><description><![CDATA[<p>Also ifndef define und endif stimmen so, da ist kein Fehler drin. Auch die Namen der Defines sind gleich, hab's auch nochmal mit C&amp;P abgesichert. Also bei den Guards sind wohl keine Schreibfehler drin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Auch #pragma once führt zum selben Ergebnis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733550</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Fri, 26 Jun 2009 22:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Fri, 26 Jun 2009 22:30:42 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Hmm. Ich würde mal vermuten, dass etwas mit den Includeguards falsch läuft.. Sicher, dass da keine Schreibfehler drinn sind?</p>
</blockquote>
<p>Hi,</p>
<p>also mal kurz hingeworfen: Includeguards helfen ja nunmal bei templates (wie std::string eines ist) nicht wirklich, wo doch die template-Instanzen tatsächlich in unterschiedlichen Übersetzungeeinheiten gedoppelt sind.<br />
Ich muss gestehen, dass ich nie so recht verstanden habe, wie Compiler/Linker das denn nun tatsächlich machen, wenn der Standard verlangt, dass diese Situation nicht als &quot;ODR-Verletzung&quot; ansehen darf - es bleibt doch, dass der Linker entscheiden muss, mit welchem Code er den Verweis auflöst.</p>
<p>Allerdings höre ich zum ersten Mal davon, dass ein MS-Compiler damit Probleme hätte ... &quot;mein&quot; xlC meckert da schon seit Jahren/Versionen und ich kann es ihm nicht verübeln.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733552</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 26 Jun 2009 22:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Fri, 26 Jun 2009 22:57:36 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Also ifndef define und endif stimmen so, da ist kein Fehler drin. Auch die Namen der Defines sind gleich, hab's auch nochmal mit C&amp;P abgesichert. Also bei den Guards sind wohl keine Schreibfehler drin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Auch #pragma once führt zum selben Ergebnis.</p>
</blockquote>
<p>dann mach es mal besser so:</p>
<pre><code class="language-cpp">inline std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Exception&amp; exc)
{
/*...*/
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733555</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 26 Jun 2009 22:57:36 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Sat, 27 Jun 2009 10:54:31 GMT]]></title><description><![CDATA[<p>Okay? Klappt. Cool, vielen Dank. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Aber ich dachte eigentlich, dass er das automatisch von selbst inline macht. Verstehe gar nicht so ganz, wieso das jetzt nötig war? Ich hatte inline als Statement kennen gelernt, was man gar nicht mehr selbst nutzen muss, weil der Compiler die Optimierung dafür übernimmt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733610</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 27 Jun 2009 10:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Sat, 27 Jun 2009 13:26:23 GMT]]></title><description><![CDATA[<p>Das betrifft das Konzept der Inline-Funktionen als solches, nicht das Schlüsselwort. Moderne Compiler können weitgehend selbst entscheiden, ob eine Funktion schlussendlich direkt in den Code eingebunden wird (inline) oder immer noch ein Funktionsaufruf stattfindet.</p>
<p>Das Schlüsselwort <code>inline</code> führt dazu, dass eine Funktionsdefinition nicht zu Linkerfehlern führt, wenn sie in mehreren Modulen vorkommt. Allerdings wäre es vielleicht klüger, in den Header nur die Deklaration zu schreiben und die Definition in eine einzelne .cpp-Datei auslagern - damit kannst du nämlich die Implementierung ändern, ohne alles neu zu kompilieren, und hast somit kleinere Abhängigkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733697</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 27 Jun 2009 13:26:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion bereits in Application.obj definiert on Sat, 27 Jun 2009 13:36:27 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das Schlüsselwort <code>inline</code> führt dazu, dass eine Funktionsdefinition nicht zu Linkerfehlern führt, wenn sie in mehreren Modulen vorkommt. Allerdings wäre es vielleicht klüger, in den Header nur die Deklaration zu schreiben und die Definition in eine einzelne .cpp-Datei auslagern - damit kannst du nämlich die Implementierung ändern, ohne alles neu zu kompilieren, und hast somit kleinere Abhängigkeiten.</p>
</blockquote>
<p>Würde ich (hier) nicht machen.<br />
Ich will nicht jedes mal, wenn irgendwo eine Exception verwendet wird, selbst eine Datei dem Projekt hinzufügen müssen...<br />
Stell dir ma vor, du müsstest immer, wenn du vector/string/list/exception/.. verwenden willst, ne zusätzliche *.cpp hinzufügen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733703</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 27 Jun 2009 13:36:27 GMT</pubDate></item></channel></rss>