<?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[Wo header inkludieren?]]></title><description><![CDATA[<p>Hi,</p>
<p>kurze simple Frage zu Headern:</p>
<p>Wenn ich eine Klasse Foo im Header Foo.h deklariere:</p>
<pre><code class="language-cpp">// Foo.h
class Foo {
public:
   std::string str;

   // Methoden etc.
};
</code></pre>
<p>brauch ich ja den header &lt;string&gt;. Wo muss/sollte ich den am besten überall inkludieren? Nur in Foo.h oder in Foo.h UND Foo.cpp oder nur in Foo.cpp?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189917/wo-header-inkludieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 17:08:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189917.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Aug 2007 14:12:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:12:59 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>kurze simple Frage zu Headern:</p>
<p>Wenn ich eine Klasse Foo im Header Foo.h deklariere:</p>
<pre><code class="language-cpp">// Foo.h
class Foo {
public:
   std::string str;

   // Methoden etc.
};
</code></pre>
<p>brauch ich ja den header &lt;string&gt;. Wo muss/sollte ich den am besten überall inkludieren? Nur in Foo.h oder in Foo.h UND Foo.cpp oder nur in Foo.cpp?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346937</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:14:55 GMT]]></title><description><![CDATA[<p>Nur in foo.cpp =&gt; Typ bei Deklaration der Klasse nicht bekannt<br />
foo.cpp bindet foo.hpp ein, daher in foo.hpp .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346940</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:14:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:15:24 GMT]]></title><description><![CDATA[<p>nur in foo.h, wenn foo.cpp foo.h inkludiert ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346941</guid><dc:creator><![CDATA[ChrisJ]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:23:09 GMT]]></title><description><![CDATA[<p>K.<br />
Aber wenn Foo.cpp &lt;string&gt; VOR &quot;foo.h&quot; inkludiert, dann müsste es doch theoretisch auch gehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346945</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:23:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:27:57 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>K.<br />
Aber wenn Foo.cpp &lt;string&gt; VOR &quot;foo.h&quot; inkludiert, dann müsste es doch theoretisch auch gehen?</p>
</blockquote>
<p>auf solche schweinereie sollte man sich _nie_ einlassen. das sorgt für geniale fehler...</p>
<p>zur eigentlichen frage: it depends. <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="😉"
    /><br />
es bringt quasi keinen nachteil es in beide einzufügen im vergleich zum einfügen nur im header, da die abarbeitung der include-guards sehr schnell geht und der header dann eh noch im cache liegt.<br />
man kann aber in den header auch nur forward-deklarationen für die klassen einführen und erst in der source-datei den eigentlich header einbinden. das kann deutlich vorteile bei der übersetzungsgeschwindigkeit bringen, wenn du zum einen viele header hast und zum anderen nicht in jeder datei, die foo.h einbindet, tatsächlich alles gebraucht wird, was eigentlich außer bei der foo.cpp immer der fall ist.</p>
<p>aus gründen der übersichtlichkeit und geschwindigkeit neige ich zu letzterem verfahren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346948</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:30:22 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>K.<br />
Aber wenn Foo.cpp &lt;string&gt; VOR &quot;foo.h&quot; inkludiert, dann müsste es doch theoretisch auch gehen?</p>
</blockquote>
<p>auf solche schweinereie sollte man sich _nie_ einlassen. das sorgt für geniale fehler...</p>
</blockquote>
<p>wieso? includes sind doch eh nur textersetzungen, oder nicht? mit nem #ifndef am anfang und nem #endif am ende einer headerdatei sollten damit alle fehlerquellen ausgeschlossen sein.</p>
<p>aber generell: wenn du etwas in foo.h includierst, brauchst du es in foo.cpp nicht nochmals einzubinden. wozu auch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346949</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:32:59 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>K.<br />
Aber wenn Foo.cpp &lt;string&gt; VOR &quot;foo.h&quot; inkludiert, dann müsste es doch theoretisch auch gehen?</p>
</blockquote>
<p>auf solche schweinereie sollte man sich _nie_ einlassen. das sorgt für geniale fehler...</p>
<p>zur eigentlichen frage: it depends. <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="😉"
    /><br />
es bringt quasi keinen nachteil es in beide einzufügen im vergleich zum einfügen nur im header, da die abarbeitung der include-guards sehr schnell geht und der header dann eh noch im cache liegt.<br />
man kann aber in den header auch nur forward-deklarationen für die klassen einführen und erst in der source-datei den eigentlich header einbinden. das kann deutlich vorteile bei der übersetzungsgeschwindigkeit bringen, wenn du zum einen viele header hast und zum anderen nicht in jeder datei, die foo.h einbindet, tatsächlich alles gebraucht wird, was eigentlich außer bei der foo.cpp immer der fall ist.</p>
<p>aus gründen der übersichtlichkeit und geschwindigkeit neige ich zu letzterem verfahren.</p>
</blockquote>
<p>Meinst du statt:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
class Foo { 
public: 
   std::string str; 

   // Methoden etc. 
};
</code></pre>
<p>das:</p>
<pre><code class="language-cpp">class string;
class Foo { 
public: 
   std::string str; 

   // Methoden etc. 
};
</code></pre>
<p>? (is bissi Pseudocode, aber vom Prinzip her).</p>
<p>Falls ja: aber das geht ja nur, wenn ich in Foo.h nirgends str benutze (z.B. wenn ich ne Methode Inline implementiere würde).<br />
War da nicht noch auch irgendwas, dass Vorwärtsdeklarationen nur bei Pointern und Referenzen funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346952</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:32:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:34:53 GMT]]></title><description><![CDATA[<p>TravisG schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>K.<br />
Aber wenn Foo.cpp &lt;string&gt; VOR &quot;foo.h&quot; inkludiert, dann müsste es doch theoretisch auch gehen?</p>
</blockquote>
<p>auf solche schweinereie sollte man sich _nie_ einlassen. das sorgt für geniale fehler...</p>
</blockquote>
<p>wieso? includes sind doch eh nur textersetzungen, oder nicht? mit nem #ifndef am anfang und nem #endif am ende einer headerdatei sollten damit alle fehlerquellen ausgeschlossen sein.</p>
</blockquote>
<p>das ist nicht das problem, so wie ich das verstehe, will er folgendes machen:<br />
foo.cpp:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &quot;foo.h&quot;
</code></pre>
<p>und dann in foo.h darauf verzichten string einzubinden. das funktioniert natürlich völlig problemlos, nur versuch mal in einen quelltext, der das im großen stil gemacht hat, irgendwas wieder zu verwenden...<br />
man sollte schlicht darauf verzichten die header so zu schreiben, dass die reihenfolge des inkludierens eine rolle spielt. sich durch solche fehlermeldungen zu kämpfen ist einfach nur ätzend. besonders, wenn es dann nicht mehr so augenscheinlich ist, sondern erst ein paar includes weiter kracht, weil da irgendein header irgendetwas inkludiert hat, das der andere dann auch noch nutzt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346953</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:34:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:42:43 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Falls ja: aber das geht ja nur, wenn ich in Foo.h nirgends str benutze (z.B. wenn ich ne Methode Inline implementiere würde).</p>
</blockquote>
<p>ja. das stellt aber normalerweise nicht wirklich ein problem da.</p>
<p>War da nicht noch auch irgendwas, dass Vorwärtsdeklarationen nur bei Pointern und Referenzen funktionieren?[/quote]<br />
ja, das ist richtig. ist aber je nach design auch nicht wirklich ein problem. in deinem falle wäre es eines, das ist richtig. aber da eher public-member hat, passt das schon. geht natürlich am einfachsten wenn man ein pimpl nutzt und bei get/set eh nur referencen durch die gegend reicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346955</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:42:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 14:46:33 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>TravisG schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>this-&gt;that schrieb:</p>
<blockquote>
<p>K.<br />
Aber wenn Foo.cpp &lt;string&gt; VOR &quot;foo.h&quot; inkludiert, dann müsste es doch theoretisch auch gehen?</p>
</blockquote>
<p>auf solche schweinereie sollte man sich _nie_ einlassen. das sorgt für geniale fehler...</p>
</blockquote>
<p>wieso? includes sind doch eh nur textersetzungen, oder nicht? mit nem #ifndef am anfang und nem #endif am ende einer headerdatei sollten damit alle fehlerquellen ausgeschlossen sein.</p>
</blockquote>
<p>das ist nicht das problem, so wie ich das verstehe, will er folgendes machen:<br />
foo.cpp:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &quot;foo.h&quot;
</code></pre>
</blockquote>
<p>achso, naja dass ist wirklich sehr fahrlässig. zuletzt hab ich sowas im sourcecode des hl2-sdks gesehen <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="🙂"
    /> (da waren dann bei den includes so sachen gestanden wie &quot;this file [in richtig fetter schrift] MUST [/schrift] be included before any other files are included&quot;. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346957</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:46:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 17:35:49 GMT]]></title><description><![CDATA[<p>Einfach ueberall nicht einbinden, wo dies keinen Compilerfehler verursacht. f'`8k</p>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox12963" /><label for="checkbox12963"></label></div><a href="http://tggc.tg.funpic.de/index.php?cat=8&amp;page=5" rel="nofollow">Autocogito</a></p>
<p>Gruß, TGGC (<a href="http://www.games-net.de/hosted/tggc" rel="nofollow">making great games since 1992</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347033</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Sat, 18 Aug 2007 17:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 17:43:05 GMT]]></title><description><![CDATA[<p>gute idee...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347034</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sat, 18 Aug 2007 17:43:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 22:03:06 GMT]]></title><description><![CDATA[<p>this-&gt;that schrieb:</p>
<blockquote>
<p>Hi,</p>
<p>kurze simple Frage zu Headern:</p>
<p>Wenn ich eine Klasse Foo im Header Foo.h deklariere:</p>
<pre><code class="language-cpp">// Foo.h
class Foo {
public:
   std::string str;

   // Methoden etc.
};
</code></pre>
<p>brauch ich ja den header &lt;string&gt;. Wo muss/sollte ich den am besten überall inkludieren? Nur in Foo.h oder in Foo.h UND Foo.cpp oder nur in Foo.cpp?</p>
</blockquote>
<p>Bei großen Projekten sollten die Header-Abhängigkeiten minimiert werden, das beschleunigt das kompilieren großer Projekte deutlich, solange Referenzen oder Zeiger verwendet werden.</p>
<pre><code class="language-cpp">// Foo.h
namespace std { class string; }

class Foo {
public:
   std::string &amp; str;

   // Methoden etc.
};

// Foo.cpp
#include &quot;foo.h&quot;
#include &quot;string.h&quot;
</code></pre>
<p>Verwendest Du die vollständigen Typen, also &quot;std::string str&quot;, muss std::string beim lesen von Foo.h bekannt sein. Also sollte es auch in Foo.h inkludiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347121</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Sat, 18 Aug 2007 22:03:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 22:09:54 GMT]]></title><description><![CDATA[<p>Xin schrieb:</p>
<blockquote>
<p>Bei großen Projekten sollten die Header-Abhängigkeiten minimiert werden, das beschleunigt das kompilieren großer Projekte deutlich, solange Referenzen oder Zeiger verwendet werden.</p>
<pre><code class="language-cpp">// Foo.h
namespace std { class string; }

class Foo {
public:
   std::string &amp; str;

   // Methoden etc.
};

// Foo.cpp
#include &quot;foo.h&quot;
#include &quot;string.h&quot;
</code></pre>
<p>Verwendest Du die vollständigen Typen, also &quot;std::string str&quot;, muss std::string beim lesen von Foo.h bekannt sein. Also sollte es auch in Foo.h inkludiert werden.</p>
</blockquote>
<p>Das ist doch bitte nicht dein Ernst?!</p>
<p>1. ist es absolut verboten für den User was in den std-Namespace zu packen<br />
2. std::string ist ein typedef auf std::basic_string&lt;char&gt;! (Und falls du auf die Idee kommst das nun zu prototypen. STL-Container dürfen beliebige Extra-Template Params haben, wenn diese mit Default Werten belegt sind)<br />
3. ist std::string&amp; und std::string zu unterschiedlich, um das mal über einen Tisch zu kloppen...</p>
<p>und mit precompiled Headern, ist das Problem ja eh wesentlich geringer...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347123</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sat, 18 Aug 2007 22:09:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 22:32:33 GMT]]></title><description><![CDATA[<p>Man inkludiert normalerweise in der Main-Datei:</p>
<pre><code class="language-cpp">//main.cpp
#include &lt;string&gt;
#include &quot;foo.h&quot;

int main()
{
// ...
return 0;
}
</code></pre>
<pre><code class="language-cpp">//foo.h

#ifndef FOO_H
#define FOO_H

class Foo
{
public:
// irgendwas :)

private:
std::string xyz;
};

#endif
</code></pre>
<p>Ansonsten in der Foo.cpp(falls vorhanden).</p>
<p>Edit: hab die Markos vergessen^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347128</guid><dc:creator><![CDATA[XP*]]></dc:creator><pubDate>Sat, 18 Aug 2007 22:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 22:37:19 GMT]]></title><description><![CDATA[<p>XP^ schrieb:</p>
<blockquote>
<p>Man inkludiert normalerweise in der Main-Datei:</p>
<pre><code class="language-cpp">//main.cpp
#include &lt;string&gt;
#include &quot;foo.h&quot;

int main()
{
// ...
return 0;
}
</code></pre>
</blockquote>
<p>Den Stil finde ich schrecklich. Ein Header sollte alles enthalten, was man braucht um ihn zu benutzen. Man kann ja nicht von anderen Programmierern erwarten, dass er die Interna des Headers kennt (und das sollte er auch gar nicht). Außerdem sind doppelte Includes kein Problem, da die meisten Preprocs daraufhin eh optimiert sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347129</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sat, 18 Aug 2007 22:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 22:37:57 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>Xin schrieb:</p>
<blockquote>
<p>Bei großen Projekten sollten die Header-Abhängigkeiten minimiert werden, das beschleunigt das kompilieren großer Projekte deutlich, solange Referenzen oder Zeiger verwendet werden.</p>
<p>Verwendest Du die vollständigen Typen, also &quot;std::string str&quot;, muss std::string beim lesen von Foo.h bekannt sein. Also sollte es auch in Foo.h inkludiert werden.</p>
</blockquote>
<p>Das ist doch bitte nicht dein Ernst?!</p>
<p>1. ist es absolut verboten für den User was in den std-Namespace zu packen</p>
</blockquote>
<p>Ich packe nichts rein. Ich behaupte nur, dass es std::string gibt.</p>
<p>rüdiger schrieb:</p>
<blockquote>
<p>2. std::string ist ein typedef auf std::basic_string&lt;char&gt;!</p>
</blockquote>
<p>Das wiederum ist ein Argument.<br />
Das war auch auf eigene Klassen gemünzt. Statt das angefragte Beispiel weiterzunutzen, hätte ich hier besser eine irgendeine Beispiel-Klasse genommen.</p>
<p>rüdiger schrieb:</p>
<blockquote>
<p>3. ist std::string&amp; und std::string zu unterschiedlich, um das mal über einen Tisch zu kloppen...</p>
</blockquote>
<p>Drum hab' ich Referenzen und eingebaute Objekte ja auch unterschieden. ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347130</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Sat, 18 Aug 2007 22:37:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 22:50:11 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>Den Stil finde ich schrecklich. Ein Header sollte alles enthalten, was man braucht um ihn zu benutzen.</p>
</blockquote>
<p>Hab ja nur ein Beispiel gezeigt <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>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Man kann ja nicht von anderen Programmierern erwarten, dass er die Interna des Headers kennt (und das sollte er auch gar nicht).</p>
</blockquote>
<p>Sicher, das kann man :p</p>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Außerdem sind doppelte Includes kein Problem, da die meisten Preprocs daraufhin eh optimiert sind.</p>
</blockquote>
<p>Trodzdem ist das ein schlechter Stil(obwohl doppel besser hält), zumindest für mich.</p>
<p>Mit freundlichen Grüßen,<br />
XP^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347135</guid><dc:creator><![CDATA[XP*]]></dc:creator><pubDate>Sat, 18 Aug 2007 22:50:11 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sat, 18 Aug 2007 23:14:06 GMT]]></title><description><![CDATA[<p>Geht das nicht mir forward-deklarationen?</p>
<pre><code class="language-cpp">// Foo.h 
class std::string;

class Foo { 
public: 
   std::string str; 

   // Methoden etc. 
    void foo(std::string bla);
};
</code></pre>
<p>Wozu muss den der Compiler hier wissen wie eine std::string aufgebaut ist? Solange man doch einfach behauptet, dass es einen std::string Typ gibt, sollte es doch reichen?</p>
<p>Inline-Methoden sind doch eh unnuetz, genau wie das inline Schluesselwort? Das ist doch eh nur ein Vorschlag fuer den Compiler, dass diese Methode geinlined (sry. fuer das Wort) wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347139</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Sat, 18 Aug 2007 23:14:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sun, 19 Aug 2007 03:14:56 GMT]]></title><description><![CDATA[<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>1. ist es absolut verboten für den User was in den std-Namespace zu packen</p>
</blockquote>
<p>Ich packe nichts rein. Ich behaupte nur, dass es std::string gibt.</p>
</blockquote>
<p>Und das darfst du nicht, selbst wenn es std::string in der Form gäbe.</p>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>2. std::string ist ein typedef auf std::basic_string&lt;char&gt;!</p>
</blockquote>
<p>Das wiederum ist ein Argument.<br />
Das war auch auf eigene Klassen gemünzt. Statt das angefragte Beispiel weiterzunutzen, hätte ich hier besser eine irgendeine Beispiel-Klasse genommen.</p>
</blockquote>
<p>Wohl wahr, aber das Modell ist eben nicht auf die Standard-Lib oder andere Libraries 3. übertragbar! Ich finde es auch unverständlich, warum es im Standard auch nur für die Iostream-Sachen ein Forward-Header gibt. Aber im Grunde ist das mit den Headern ja nicht so dramatisch bei modernen Compilern.</p>
<p>XP^ schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Man kann ja nicht von anderen Programmierern erwarten, dass er die Interna des Headers kennt (und das sollte er auch gar nicht).</p>
</blockquote>
<p>Sicher, das kann man :p</p>
</blockquote>
<p>Ne, das ist schlechter Stil. Ich hoffe mal, dass du deine Klassen-Interfaces nicht ähnlich gestaltest.</p>
<p>XP^ schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Außerdem sind doppelte Includes kein Problem, da die meisten Preprocs daraufhin eh optimiert sind.</p>
</blockquote>
<p>Trodzdem ist das ein schlechter Stil(obwohl doppel besser hält), zumindest für mich.</p>
</blockquote>
<p>Weil?</p>
<p>DEvent schrieb:</p>
<blockquote>
<p>Geht das nicht mir forward-deklarationen?</p>
</blockquote>
<p>Lies doch mal was Xin vorgeschlagen hat und vor allem meine Antwort dazu.</p>
<p>DEvent schrieb:</p>
<blockquote>
<p>Wozu muss den der Compiler hier wissen wie eine std::string aufgebaut ist? Solange man doch einfach behauptet, dass es einen std::string Typ gibt, sollte es doch reichen?</p>
</blockquote>
<p>Ne, er muss ja zumindest die Größe eines std::string-Objektes kennen.</p>
<p>DEvent schrieb:</p>
<blockquote>
<p>Inline-Methoden sind doch eh unnuetz,</p>
</blockquote>
<p>Ne</p>
<p>DEvent schrieb:</p>
<blockquote>
<p>genau wie das inline Schluesselwort?</p>
</blockquote>
<p>Ne</p>
<p>DEvent schrieb:</p>
<blockquote>
<p>Das ist doch eh nur ein Vorschlag fuer den Compiler, dass diese Methode geinlined (sry. fuer das Wort) wird?</p>
</blockquote>
<p>Und wenn es gar nicht erst inline ist, kann er die nur schwer inlinen. Außerdem ist es wichtig, um das Linkage für die Methode/Funktion richtig hinzubekommen. Ob der Compiler es nun für sinnvoll hält die Methode zu inlinen oder nicht, ist ne andere Sache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347140</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sun, 19 Aug 2007 03:14:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sun, 19 Aug 2007 01:41:50 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>Ne, er muss ja zumindest die Größe eines std::string-Objektes kennen.</p>
</blockquote>
<p>Ja stimmt, das habe ich vergessen.</p>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Und wenn es gar nicht erst inline ist, kann er die nur schwer inlinen. Außerdem ist es wichtig, um das Linkage für die Methode/Funktion richtig hinzubekommen. Ob der Compiler es nun für sinnvoll hält die Methode zu inlinen oder nicht, ist ne andere Sache.</p>
</blockquote>
<p>Das verstehe ich nicht ganz. Der Compiler entscheidet, ob die Methode inline wird oder nicht. Also wozu dann das inline Schluesselwort?</p>
<p>Aus <a href="http://www.parashift.com/c++-faq-lite/inline-functions.html:" rel="nofollow">http://www.parashift.com/c++-faq-lite/inline-functions.html:</a></p>
<blockquote>
<p>There are several ways to designate that a function is inline, some of which involve the inline keyword, others do not. No matter how you designate a function as inline, it is a request that the compiler is allowed to ignore: it might inline-expand some, all, or none of the calls to an inline function.</p>
<p>[9.3] Do inline functions improve performance?<br />
Yes and no. Sometimes. Maybe.</p>
<p>There are no simple answers. inline functions might make the code faster, they might make it slower. They might make the executable larger, they might make it smaller. They might cause thrashing, they might prevent thrashing. And they might be, and often are, totally irrelevant to speed.</p>
</blockquote>
<p>Das sind mir irgendwie zu viele &quot;vielleicht&quot;, &quot;vielleicht nicht&quot;. Ist es da nicht das beste das inline Keyword ueberhaupt nicht zu benuzten und dem Compiler somit freie Hand lassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347164</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Sun, 19 Aug 2007 01:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sun, 19 Aug 2007 01:53:33 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>1. ist es absolut verboten für den User was in den std-Namespace zu packen</p>
</blockquote>
<p>Ich packe nichts rein. Ich behaupte nur, dass es std::string gibt.</p>
</blockquote>
<p>Und das darfst du nicht, selbst wenn es std::string in der Form gäbe.</p>
</blockquote>
<p>Wer sagt das?</p>
<p>Entweder stimmt die Deklaration, dann spare ich Zeit beim kompilieren.<br />
Oder es stimmt nicht, dann kann ich nicht kompilieren.</p>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>2. std::string ist ein typedef auf std::basic_string&lt;char&gt;!</p>
</blockquote>
<p>Das wiederum ist ein Argument.<br />
Das war auch auf eigene Klassen gemünzt. Statt das angefragte Beispiel weiterzunutzen, hätte ich hier besser eine irgendeine Beispiel-Klasse genommen.</p>
</blockquote>
<p>Wohl war, aber das Modell ist eben nicht auf die Standard-Lib oder andere Libraries 3. übertragbar!</p>
</blockquote>
<p>Ich kann mich nicht erinnern, irgendwas im Bereich std deklariert zu haben, aber ich sehe da jetzt keinen Grund für, es nicht zu tun und Du lieferst mir keinen, außer &quot;Du darfst das nicht&quot;.</p>
<p>Gesetze ohne Begründung interessieren mich nur, wenn bei Zuwiderhandlung nennenswerte Strafen stehen. Andernfalls interessiert mich die Lösung des Problems mehr. <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>
<p>DEvent schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Und wenn es gar nicht erst inline ist, kann er die nur schwer inlinen. Außerdem ist es wichtig, um das Linkage für die Methode/Funktion richtig hinzubekommen. Ob der Compiler es nun für sinnvoll hält die Methode zu inlinen oder nicht, ist ne andere Sache.</p>
</blockquote>
<p>Das verstehe ich nicht ganz. Der Compiler entscheidet, ob die Methode inline wird oder nicht. Also wozu dann das inline Schluesselwort?</p>
</blockquote>
<p>Inline heißt, dass Du eine Funktion im Header verfügbar machen musst (und darfst) und dass der Compiler den Ratschlag erhält, die Funktion nicht zu rufen, sondern an den Aufrufen einzukompilieren.</p>
<p>DEvent schrieb:</p>
<blockquote>
<p>Das sind mir irgendwie zu viele &quot;vielleicht&quot;, &quot;vielleicht nicht&quot;. Ist es da nicht das beste das inline Keyword ueberhaupt nicht zu benuzten und dem Compiler somit freie Hand lassen?</p>
</blockquote>
<p>Benutze inline dann, wenn Du sicher bist, dass die Funktion nicht zu einer Library gehört und sich ändern könnte. Alte Programme würden dann nicht die Funktion rufen, sondern die veraltete Version einkompiliert haben.<br />
Komplexe und aufwendige Funktionen sind mit großer Wahrscheinlichkeit nicht für inline gedacht. Hier kann der Compiler sich auch gegen den Ratschlag wenden und die Inline-Funktion als normale Funktion umsetzen.</p>
<p>Für einfache Getter und Setter hilft inline, die Aufrufe (dadurch, dass sie nicht stattfinden) zu beschleunigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347167</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Sun, 19 Aug 2007 01:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sun, 19 Aug 2007 03:13:52 GMT]]></title><description><![CDATA[<p>DEvent schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Ne, er muss ja zumindest die Größe eines std::string-Objektes kennen.</p>
</blockquote>
<p>Ja stimmt, das habe ich vergessen.</p>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Und wenn es gar nicht erst inline ist, kann er die nur schwer inlinen. Außerdem ist es wichtig, um das Linkage für die Methode/Funktion richtig hinzubekommen. Ob der Compiler es nun für sinnvoll hält die Methode zu inlinen oder nicht, ist ne andere Sache.</p>
</blockquote>
<p>Das verstehe ich nicht ganz. Der Compiler entscheidet, ob die Methode inline wird oder nicht. Also wozu dann das inline Schluesselwort?</p>
</blockquote>
<p>Das inline Schlüsselwort dient vor allem dem Linker</p>
<pre><code class="language-cpp">// foo.h
void dosth() { /* ... */ }

// foo.cpp
#include &quot;foo.h&quot;

// main.cpp
#include &quot;foo.h&quot;

int main() { }
</code></pre>
<p>wird sonst ein Linkerfehler schmeißen, da dosth in zwei Übersetzungseinheiten vorhanden ist. Mit inline legt der Linker in jedem Objekt eine Kopie an oder ist zumindest in der Lage den Konflikt aufzulösen.</p>
<blockquote>
<p>Ist es da nicht das beste das inline Keyword ueberhaupt nicht zu benuzten und dem Compiler somit freie Hand lassen?</p>
</blockquote>
<p>Wenn der Compiler die Implementierung der Methode nicht sieht, wird er sie auch nicht inlinen können. Mittlerweile sind die Linker zwar schon etwas intelligenter geworden. Aber darauf kann man sich nicht verlassen.</p>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>1. ist es absolut verboten für den User was in den std-Namespace zu packen</p>
</blockquote>
<p>Ich packe nichts rein. Ich behaupte nur, dass es std::string gibt.</p>
</blockquote>
<p>Und das darfst du nicht, selbst wenn es std::string in der Form gäbe.</p>
</blockquote>
<p>Wer sagt das?</p>
</blockquote>
<p>Der C++ Standard...</p>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>2. std::string ist ein typedef auf std::basic_string&lt;char&gt;!</p>
</blockquote>
<p>Das wiederum ist ein Argument.<br />
Das war auch auf eigene Klassen gemünzt. Statt das angefragte Beispiel weiterzunutzen, hätte ich hier besser eine irgendeine Beispiel-Klasse genommen.</p>
</blockquote>
<p>Wohl war, aber das Modell ist eben nicht auf die Standard-Lib oder andere Libraries 3. übertragbar!</p>
</blockquote>
<p>Ich kann mich nicht erinnern, irgendwas im Bereich std deklariert zu haben, aber ich sehe da jetzt keinen Grund für, es nicht zu tun und Du lieferst mir keinen, außer &quot;Du darfst das nicht&quot;.</p>
<p>Gesetze ohne Begründung interessieren mich nur, wenn bei Zuwiderhandlung nennenswerte Strafen stehen. Andernfalls interessiert mich die Lösung des Problems mehr. <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>Schau halt in den Standard <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="🙄"
    /> Wie gesagt, es gibt STL-Implementierungen, die zB mehr Template-Parameter haben (Dinkumware macht das AFAIK). Was absolut konform ist! Also wirst du dich bei so etwas aus Ärger einstellen müssen.</p>
<p>Und precompiled Header und &quot;intelligentere&quot; Precompiler haben das Problem ja ohnehin reduziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347171</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sun, 19 Aug 2007 03:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sun, 19 Aug 2007 04:15:36 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>Das inline Schlüsselwort dient vor allem dem Linker</p>
</blockquote>
<p>Tolle Sprache, die dem Linker dient. Die Sprache soll mir dienen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /> Ich hoffe sowas wird im C++0x ausgebessert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347176</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Sun, 19 Aug 2007 04:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sun, 19 Aug 2007 10:33:34 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>Xin schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>Xin schrieb:</p>
<blockquote>
<p>Ich packe nichts rein. Ich behaupte nur, dass es std::string gibt.</p>
</blockquote>
<p>Und das darfst du nicht, selbst wenn es std::string in der Form gäbe.</p>
</blockquote>
<p>Wer sagt das?</p>
</blockquote>
<p>Der C++ Standard...</p>
</blockquote>
<p>Du hast nicht zufällig die Stelle parat, wo steht, dass ich eine Deklaration nicht von Hand benutzen darf? Schließlich definiere ich nichts Neues in std nicht, oder definiere vorhandenes um, sondern behaupte nur, dass es etwas gibt.</p>
<p>Ist dem nicht so, oder ist meine Behauptung falsch, werde ich darauf hingewiesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347271</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Sun, 19 Aug 2007 10:33:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wo header inkludieren? on Sun, 19 Aug 2007 11:11:32 GMT]]></title><description><![CDATA[<p>Xin schrieb:</p>
<blockquote>
<p>Du hast nicht zufällig die Stelle parat, wo steht, dass ich eine Deklaration nicht von Hand benutzen darf? Schließlich definiere ich nichts Neues in std nicht, oder definiere vorhandenes um, sondern behaupte nur, dass es etwas gibt.</p>
</blockquote>
<p>Es geht nicht um Definitionen sondern um Deklarationen. Und da ist im Namensraum std für den Nutzer alles bis auf eine kleine Ausnahme verboten. Die kleine Ausnahme betrifft Spezialisierungen (partiell oder explizit) von Templates für Parametertypen, die der Nutzer selbst definiert hat (durch letzteres verhindern wir, dass man die partielle Ordnung für andere Typen durcheinanderbringen kann - mithin ist die Semantik für andere Typen nicht veränderbar). Zu finden in 17.4.2.1 [lib.using.headers]/3 (verbietet effektiv jede Form von Vorwärtsdeklaration - selbst wenn die exakte Signatur bekannt ist) und 17.4.3.1 [lib.reserved.names]/1 des Standards.</p>
<p>Ein Problem besteht sowieso nicht. Der weit überwiegende Teil der Definitionen in der Standardbibliothek betrifft Templates und die brauchen wir sowieso, wenn wir das entsprechende Template benutzen wollen. Eine reine Vorwärtsdeklaration ist wird nur in wenigen Fällen in der gesamten ÜE ausreichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347287</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 19 Aug 2007 11:11:32 GMT</pubDate></item></channel></rss>