<?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[Problem mit circular dependency]]></title><description><![CDATA[<p>Ich hab ein Problem.</p>
<p>Zwei Klassen.h sehen so aus:</p>
<pre><code class="language-cpp">// A.h

#include V.h

class A
{
public:
  static void meineMethode();
};

// V.h
class A; // forward decl

class V
{
public:
  V(A* a);

  inline void test() {A::meineMethode();}

};
</code></pre>
<p>Ohne die inline void test Methode war die forward decl ja völlig in ordnung, ist ja nur ein Pointer, nun hab ich aber die test Methode, welche auf die statische Methode von A zugreifen muss und demnach müsste ich nun anstatt der forward decl ein #include &quot;A.h&quot; schreiben, was aber dann ne gegenseitige Abhängigkeit schaft.</p>
<p>Wie umgeht man das problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219765/problem-mit-circular-dependency</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 19:03:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219765.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Aug 2008 10:27:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 10:28:12 GMT]]></title><description><![CDATA[<p>Ich hab ein Problem.</p>
<p>Zwei Klassen.h sehen so aus:</p>
<pre><code class="language-cpp">// A.h

#include V.h

class A
{
public:
  static void meineMethode();
};

// V.h
class A; // forward decl

class V
{
public:
  V(A* a);

  inline void test() {A::meineMethode();}

};
</code></pre>
<p>Ohne die inline void test Methode war die forward decl ja völlig in ordnung, ist ja nur ein Pointer, nun hab ich aber die test Methode, welche auf die statische Methode von A zugreifen muss und demnach müsste ich nun anstatt der forward decl ein #include &quot;A.h&quot; schreiben, was aber dann ne gegenseitige Abhängigkeit schaft.</p>
<p>Wie umgeht man das problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560741</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Thu, 07 Aug 2008 10:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 10:36:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie umgeht man das problem?</p>
</blockquote>
<p>Mach das inline weg und trenne interface und impl. (header und cpp files...)<br />
Inline finde ich persönlich eh nicht nötig...<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560746</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 07 Aug 2008 10:36:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 10:58:26 GMT]]></title><description><![CDATA[<p>simon.gysi schrieb:</p>
<blockquote>
<p>Inline finde ich persönlich eh nicht nötig...</p>
</blockquote>
<p>Das ist auch weniger Geschmackssache des Coders als vielmehr Entscheidugssache des Compilers. Ein explizit hingeschriebens inline ist bestenfalls ein Wink mit dem Zaunpfahl - der Compiler kann, muss aber nicht drauf reagieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560765</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 07 Aug 2008 10:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 11:12:03 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>simon.gysi schrieb:</p>
<blockquote>
<p>Inline finde ich persönlich eh nicht nötig...</p>
</blockquote>
<p>Das ist auch weniger Geschmackssache des Coders als vielmehr Entscheidugssache des Compilers. Ein explizit hingeschriebens inline ist bestenfalls ein Wink mit dem Zaunpfahl - der Compiler kann, muss aber nicht drauf reagieren...</p>
</blockquote>
<p>Genau. Und wenn ich noch nicht mit der Performance kämpfe, dann lasse ich solche Keywords weg. Wenn der Profiler mit sagt, dass es dort hapert, gebe ich dem Compiler den Wink... :-))</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560775</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 07 Aug 2008 11:12:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 11:27:59 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>simon.gysi schrieb:</p>
<blockquote>
<p>Inline finde ich persönlich eh nicht nötig...</p>
</blockquote>
<p>Das ist auch weniger Geschmackssache des Coders als vielmehr Entscheidugssache des Compilers. Ein explizit hingeschriebens inline ist bestenfalls ein Wink mit dem Zaunpfahl - der Compiler kann, muss aber nicht drauf reagieren...</p>
</blockquote>
<p>Eine inline-Funktion muss nicht inline expandiert werden, das ist richtig. Lässt du das inline aber weg, hat der Compiler keine Chance, sie zu inlinen (zumindest nicht in einem traditionellen Übersetzungsmodell).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560784</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 07 Aug 2008 11:27:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 11:35:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Eine inline-Funktion muss nicht inline expandiert werden, das ist richtig. Lässt du das inline aber weg, hat der Compiler keine Chance, sie zu inlinen (zumindest nicht in einem traditionellen Übersetzungsmodell).</p>
</blockquote>
<p>Ja. Ich weiss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560789</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 07 Aug 2008 11:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 11:54:30 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Lässt du das inline aber weg, hat der Compiler keine Chance, sie zu inlinen (zumindest nicht in einem traditionellen Übersetzungsmodell).</p>
</blockquote>
<p>Was meinst mit traditionellem Übersetzungsmodell?<br />
Ich hab hier grad Sutters &quot;Exceptionel C++ Style&quot; vorliegen, dort heißt es</p>
<blockquote>
<p>Your compiler [...] may ignore you, in three interesting ways:<br />
- By refusing to inline calls to functions that you declared <code>inline</code><br />
- By inlining calls to functions you <em>didn't</em> declare <code>inline</code></p>
<p>[...] Because you can't write a conforming program that could tell the difference, this falls into the category of perfectly legitimate optimizations that a compiler can (and often should) perform.</p>
</blockquote>
<p>Ich weiß, wenn man aber die Funktionsdefinition von der Deklaration trennt und die Funktion deshalb in ner anderen ÜE landet als der aufrufende Code...</p>
<blockquote>
<p>In particular, functions whose definitions are not put into header files but put into separate modules are commonly thought to be uninlineable [...]<br />
As far as the compiler goes, they would be correct. While compiling main.cpp, even an inordinately precocious compiler could not possibly peek into the definition of Square(). A precocious linker, however, could. [...] one popular product that supports it [cross-module inlining] totday is MSVC version 7.0 an higher, using /LTCG switch, which stands for &quot;link time code generation&quot;</p>
</blockquote>
<p>Die Diskussion, wann inlining noch stattfinden kann, geht noch weiter, über den Zeitpunkt der Installation über die Laufzeit bis hin zu komplexeren runtime environments (z.B. die Java Virtual Machine), die zu verschiedensten Zeitpunkten inlinen können (z.B.just in time compilation).</p>
<p>Gut, das geht jetzt weit über &quot;traditionelles Übersetzungsmodell&quot; hinaus, allerdings sind die Traditionen schon was älter, und wir leben in einer modernen Welt ohne Angst vor Neuerungen (zumindest was solche Techniken angeht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560805</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 07 Aug 2008 11:54:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 12:04:41 GMT]]></title><description><![CDATA[<p>Das sollte man alles dazusagen, wenn man behauptet, dass inline unnötig ist. Die Situation ist eben nicht analog zu beispielsweise register, sondern man muss schon den richtigen Compiler nehmen und den entsprechenden Schalter setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560810</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 07 Aug 2008 12:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 12:27:17 GMT]]></title><description><![CDATA[<p>Mein Fazit aus alledem ist immernoch, inline nicht explizit anzugeben.<br />
Über Inlining nachzudenken macht erst Sinn, wenn mir der Profiler das sagt - und wenn er mir dann sgat dass es vielleicht was bringen könnte, dann ziehe ich (zur Zeit noch) die Definition aus der .cpp in den Header (ob ich da jetzt inline reinschreibe oder die Definition mitliefere, rekompilieren muss ich eh alles) und überlasse weiterhin dem Compiler die Entscheidung, ob und wo er die Funktion inlined. (Ein inline ofne Definition bringt ja traditionell eh nur innerhalb der ÜE was).<br />
Später wenn cross-module inlining weiter verbreitet (und ausgefeilt) ist, verzichte ich auch darauf und vertraue der Technik.<br />
Früher hat ein Entwickler noch selbst entscheiden müssen, welche Variable er in welches Register schiebt, irgendwann haben die Compiler das dann übernommen. Mit dem Inlining ist das nicht anders, wir können nurnoch Entscheidungshilfen bieten auf die eh kaum ein Compiler noch großen Wert legt, bald (vllt. auch jetzt schon) kann mans sich auch ganz abgewöhnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560825</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 07 Aug 2008 12:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit circular dependency on Thu, 07 Aug 2008 12:43:10 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Mein Fazit aus alledem ist immernoch, inline nicht explizit anzugeben.<br />
Über Inlining nachzudenken macht erst Sinn, wenn mir der Profiler das sagt - und wenn er mir dann sgat dass es vielleicht was bringen könnte, dann ziehe ich (zur Zeit noch) die Definition aus der .cpp in den Header (ob ich da jetzt inline reinschreibe oder die Definition mitliefere, rekompilieren muss ich eh alles) und überlasse weiterhin dem Compiler die Entscheidung, ob und wo er die Funktion inlined. (Ein inline ofne Definition bringt ja traditionell eh nur innerhalb der ÜE was).<br />
Später wenn cross-module inlining weiter verbreitet (und ausgefeilt) ist, verzichte ich auch darauf und vertraue der Technik.<br />
Früher hat ein Entwickler noch selbst entscheiden müssen, welche Variable er in welches Register schiebt, irgendwann haben die Compiler das dann übernommen. Mit dem Inlining ist das nicht anders, wir können nurnoch Entscheidungshilfen bieten auf die eh kaum ein Compiler noch großen Wert legt, bald (vllt. auch jetzt schon) kann mans sich auch ganz abgewöhnen.</p>
</blockquote>
<p>100% ACK.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560835</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 07 Aug 2008 12:43:10 GMT</pubDate></item></channel></rss>