<?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[Frage zur One Definition Rule]]></title><description><![CDATA[<p>Wann kommt man eigentlich in die Verlegenheit diese Regel zu verletzen? Ich bin selbst noch C++-Anfänger, aber ich bin auch noch nie auf die Idee gekommen irgend eine Funktion/Klasse mehr als einmal zu definieren. Oder habe ich da irgendwas komplett falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310495/frage-zur-one-definition-rule</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 11:36:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310495.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Nov 2012 06:03:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 06:35:30 GMT]]></title><description><![CDATA[<p>Wann kommt man eigentlich in die Verlegenheit diese Regel zu verletzen? Ich bin selbst noch C++-Anfänger, aber ich bin auch noch nie auf die Idee gekommen irgend eine Funktion/Klasse mehr als einmal zu definieren. Oder habe ich da irgendwas komplett falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270326</guid><dc:creator><![CDATA[Lichtweite]]></dc:creator><pubDate>Tue, 13 Nov 2012 06:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 06:26:41 GMT]]></title><description><![CDATA[<p>Dann erstelle mal eine Headerdatei, die &quot;int KONSTANTE = 12&quot; enthält und inkludiere diese in mehreren Quelldateien Deines Projekts <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270328</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 13 Nov 2012 06:26:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 06:37:05 GMT]]></title><description><![CDATA[<p>Ist dafür nicht der Includeguard da? Und es ist ja dann an einer Stelle definiert, nämlich in dieser einen Headerdatei, oder nicht? Ich bin jetzt etwas durcheinander <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270329</guid><dc:creator><![CDATA[Lichtweite]]></dc:creator><pubDate>Tue, 13 Nov 2012 06:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 06:40:52 GMT]]></title><description><![CDATA[<p>Der Includeguard verhindert lediglich, dass Du den Header mehrmals in einer Quelldatei inkludierst.</p>
<p>Und &quot;Inklusion&quot; ist reine Textersetzung. Der Präprozessor setzt den Inhalt der Datei an der Stelle der Include-Anweisung ein. Auch in mehreren voneinander unabhängigen Quelldateien <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270330</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 13 Nov 2012 06:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 06:50:36 GMT]]></title><description><![CDATA[<p>Ja schon klar wie include funktioniert, nur frage ich mir nach wie vor, wie man auf die Idee kommt in der Headerdatei eine Funktion/Klasse zu definieren, außer die Funktion ist inline?</p>
<p>Die One Definitions Rule gilt also auch für Konstanten, man soll also auch diese auch erst in der Sourcedatei definieren, Bsp. HALF_PI? Dann hätte man aber in mehreren Dateien einen Definition und nicht nur in einer Hederdatei. Auf der anderen Seite hat man nur eine Definition, die aber von jeder Einheit inkludiert wird. *grübel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270332</guid><dc:creator><![CDATA[Lichtweite]]></dc:creator><pubDate>Tue, 13 Nov 2012 06:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 06:54:28 GMT]]></title><description><![CDATA[<p>foo.cpp</p>
<pre><code class="language-cpp">int foo;
</code></pre>
<p>foo.h</p>
<pre><code class="language-cpp">#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED FOO_H_INCLUDED

extern int foo;

#endif /* FOO_H_INCLUDED */
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot;

int main()
{
    foo = 42;
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270334</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Tue, 13 Nov 2012 06:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 07:11:16 GMT]]></title><description><![CDATA[<p>Swordfish schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Das Dateimodell von C++ ist so eine Scheiße. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Warum wurden Module aus C++11 rausgenommen? Ich schätze mal Templates machen wieder Schwierigkeiten, würde aber gern mal was dazu lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270335</guid><dc:creator><![CDATA[nix_]]></dc:creator><pubDate>Tue, 13 Nov 2012 07:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 07:14:44 GMT]]></title><description><![CDATA[<p>Lichtweite schrieb:</p>
<blockquote>
<p>Ja schon klar wie include funktioniert, nur frage ich mir nach wie vor, wie man auf die Idee kommt in der Headerdatei eine Funktion/Klasse zu definieren, außer die Funktion ist inline?</p>
</blockquote>
<p>Wenn man auf die Idee kommt, verletzt man die ODR <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<blockquote>
<p>Die One Definitions Rule gilt also auch für Konstanten, man soll also auch diese auch erst in der Sourcedatei definieren, Bsp. HALF_PI?</p>
</blockquote>
<p>Nein, Konstanten kannst Du auch im Header definieren. Das im Beispiel war allerdings keine Konstante (trotz des Namens). Es sollte lediglich zeigen, wie man die ODR verletzen kann, wenn man an dieser Stelle &quot;static const&quot; vergisst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270336</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 13 Nov 2012 07:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 09:12:07 GMT]]></title><description><![CDATA[<p>Ok dann bin ich noch nicht in die Verlegenheit gekommen die Regel zu verletzten, ohne zu wissen dass es sie überhaupt gibt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270371</guid><dc:creator><![CDATA[Lichtweite]]></dc:creator><pubDate>Tue, 13 Nov 2012 09:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 09:51:18 GMT]]></title><description><![CDATA[<p>Ach du kannst die ODR auch verletzen ohne es zu merken.<br />
Wird z.B. lustig wenn man inline Funktionen oder Templates verwendet, und dann z.B. darin verwendete Funktionen unterschiedlich aufgelöst werden, je nachdem welche Header davor inkuldiert wurden.<br />
Beispiel:</p>
<p>Translation Unit A</p>
<pre><code class="language-cpp">// in irgend einer Header definiert
void foo(...);

// in &quot;Bar.h&quot;
inline void bar()
{
    int i;
    foo(i);
}
</code></pre>
<p>Translation Unit B</p>
<pre><code class="language-cpp">// in irgend einer anderen Header definiert
void foo(int i);

// in &quot;Bar.h&quot;
inline void bar()
{
    int i;
    foo(i);
}
</code></pre>
<p>Und schon haben wir die ODR verletzt, bekommen aber üblicherweise keine Diagnostic (Fehlermeldung/Warning). Dafür aber ein schönes Ratespiel was nun wirklich passieren wird und im Falle des Falles viele lustige Stunden der Fehlersuche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270384</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 13 Nov 2012 09:51:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 12:46:22 GMT]]></title><description><![CDATA[<p>Das ergibt dann das undefinierte Verhalten, richtig? Aber wie kommt es zu so einer Konstellation? Wieso sollte ich bei inline Funktionen Deklaration und Definition in getrennten Dateien halten? Immer wenn ich denke, ich habe es verstanden, ergeben sich neue Fragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270451</guid><dc:creator><![CDATA[Lichtweite]]></dc:creator><pubDate>Tue, 13 Nov 2012 12:46:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 13:40:13 GMT]]></title><description><![CDATA[<p>Lichtweite schrieb:</p>
<blockquote>
<p>Das ergibt dann das undefinierte Verhalten, richtig? Aber wie kommt es zu so einer Konstellation? Wieso sollte ich bei inline Funktionen Deklaration und Definition in getrennten Dateien halten?</p>
</blockquote>
<p>Solltst du nicht, aber wie hustbaer gezeigt hat ist die Definition immer kontextabhängig, d.h. die Definition im Header kann von ÜE zu ÜE in unterschiedlichen Kontexten stehen und deshalb nur syntaktisch identisch sein, semantisch aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270471</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 13 Nov 2012 13:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 13:53:02 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Beispiel</p>
</blockquote>
<p>Aus diesem Grund packt man immer alles, was nicht in einem Header deklariert wurde, in einen anonymen Namensraum rein: <code>namespace { ... }</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270478</guid><dc:creator><![CDATA[anonymespace]]></dc:creator><pubDate>Tue, 13 Nov 2012 13:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Tue, 13 Nov 2012 14:35:00 GMT]]></title><description><![CDATA[<p>Lichtweite schrieb:</p>
<blockquote>
<p>Die One Definitions Rule gilt also auch für Konstanten, man soll also auch diese auch erst in der Sourcedatei definieren, Bsp. HALF_PI? Dann hätte man aber in mehreren Dateien einen Definition und nicht nur in einer Hederdatei. Auf der anderen Seite hat man nur eine Definition, die aber von jeder Einheit inkludiert wird. *grübel</p>
</blockquote>
<p>Kleiner Hinweis: Globale Konstanten haben <em>internal linkage</em>, dh:</p>
<pre><code>// a.h
int pi = 3;

// main.cc
#include &quot;a.h&quot;

// a.cc
#include &quot;a.h&quot;

g++ a.cc main.cc ...  :warning: autsch linker meckert weil er zwei definitionen 
von pi in zwei objekt dateien hat.
</code></pre>
<pre><code>// a.h
const int pi = 3; // nun const -&gt; internal linkage. name wird nicht nach außen freigegeben

// main.cc
#include &quot;a.h&quot;

// a.cc
#include &quot;a.h&quot;

g++ a.cc main.cc ... funktioniert!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2270487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270487</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 13 Nov 2012 14:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur One Definition Rule on Wed, 14 Nov 2012 17:27:08 GMT]]></title><description><![CDATA[<p>anonymespace schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Beispiel</p>
</blockquote>
<p>Aus diesem Grund packt man immer alles, was nicht in einem Header deklariert wurde, in einen anonymen Namensraum rein: <code>namespace { ... }</code></p>
</blockquote>
<p>Du hast nicht verstanden worum es geht.<br />
Die drei Funktionen &quot;foo(...)&quot;, &quot;foo(int)&quot; und &quot;bar()&quot; sind alle drei in Headers definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2270863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2270863</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 14 Nov 2012 17:27:08 GMT</pubDate></item></channel></rss>