<?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[Header Fallen]]></title><description><![CDATA[<p>Hallo</p>
<p>So, nun ein paar ernstere Fragen. Gehe ich richtig der Annahme, dass man bei Deklarationen im Header (welcher von anderen Units verwendet wird), gut aufpassen muss? Ich glaube viele sind sich garnicht bewusst, dass wenn sie z.B. eine Variable in einem Header deklarieren, diese dann (bei verwendung) in jeder *.cpp Unit eigenständig definiert wird. Das gewünschte Ergebnis wäre aber z.B. erst mit einer extern deklaration erreicht. Z.B. wenn jemand folgendes schreibt:</p>
<pre><code class="language-cpp">//header.h
int i;

//unit1.cpp
#include &quot;header.h&quot;

i = 1; //definition von i als eigenständige Variable

//unit2.cpp
#include &quot;header.h&quot;

i = 2; //definition von i als eigenständige Variable. i von unit1.cpp ist immer noch auf 1.
</code></pre>
<p>Jetzt ging man aber davon aus, da eine Deklaration bereits vorgenommen wurde, die definition auf diese direkt zugreift. Das ist aber falsch, stimmt doch oder? Man müsste hier also im Header die extern deklaration einleiten um den gewünschten Effekt zu erzielen, oder sehe ich das falsch?</p>
<p>Im Grunde ist eine Deklaration im header auch nichts anderes, als hätte man in unit1.cpp am anfang int i = 1; geschrieben oder? Der Unterschied an einem Header ist also nur der, dass man diese aus Sicht des Compilers nunmal in andere Units einbinden kann, sonst nichts anderes, ausser das Header grundsätzlich für Deklarationen verwendet werden.</p>
<p>Also muss man eigentlich immer gut aufpassen in wie fern man seine Header deklarationen verwenden möchte, oder nicht? Und noch eine Frage: Eine Deklaration ansich nimmt ja noch garkeinen Speicher ein (ich glaube es wird nicht einmal Assembler Code erzeugt), solange die Definition nicht erzeugt wurde, korrekt? Somit ist mit der Deklaration also nur der Typ und somit die Grösse klar. Ich frage das, weil wenn man nun in einem Header deklarationen hat und man dann in unterschiedlichen Units die Definition macht, wird eben jedesmal neuer Speicher verwendet, es sei denn die Deklaration ist extern und die Definition kommt in einer analogen Datei dann vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246801/header-fallen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 20:54:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246801.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Aug 2009 20:59:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Header Fallen on Sat, 01 Aug 2009 20:59:57 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>So, nun ein paar ernstere Fragen. Gehe ich richtig der Annahme, dass man bei Deklarationen im Header (welcher von anderen Units verwendet wird), gut aufpassen muss? Ich glaube viele sind sich garnicht bewusst, dass wenn sie z.B. eine Variable in einem Header deklarieren, diese dann (bei verwendung) in jeder *.cpp Unit eigenständig definiert wird. Das gewünschte Ergebnis wäre aber z.B. erst mit einer extern deklaration erreicht. Z.B. wenn jemand folgendes schreibt:</p>
<pre><code class="language-cpp">//header.h
int i;

//unit1.cpp
#include &quot;header.h&quot;

i = 1; //definition von i als eigenständige Variable

//unit2.cpp
#include &quot;header.h&quot;

i = 2; //definition von i als eigenständige Variable. i von unit1.cpp ist immer noch auf 1.
</code></pre>
<p>Jetzt ging man aber davon aus, da eine Deklaration bereits vorgenommen wurde, die definition auf diese direkt zugreift. Das ist aber falsch, stimmt doch oder? Man müsste hier also im Header die extern deklaration einleiten um den gewünschten Effekt zu erzielen, oder sehe ich das falsch?</p>
<p>Im Grunde ist eine Deklaration im header auch nichts anderes, als hätte man in unit1.cpp am anfang int i = 1; geschrieben oder? Der Unterschied an einem Header ist also nur der, dass man diese aus Sicht des Compilers nunmal in andere Units einbinden kann, sonst nichts anderes, ausser das Header grundsätzlich für Deklarationen verwendet werden.</p>
<p>Also muss man eigentlich immer gut aufpassen in wie fern man seine Header deklarationen verwenden möchte, oder nicht? Und noch eine Frage: Eine Deklaration ansich nimmt ja noch garkeinen Speicher ein (ich glaube es wird nicht einmal Assembler Code erzeugt), solange die Definition nicht erzeugt wurde, korrekt? Somit ist mit der Deklaration also nur der Typ und somit die Grösse klar. Ich frage das, weil wenn man nun in einem Header deklarationen hat und man dann in unterschiedlichen Units die Definition macht, wird eben jedesmal neuer Speicher verwendet, es sei denn die Deklaration ist extern und die Definition kommt in einer analogen Datei dann vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753743</guid><dc:creator><![CDATA[knoffe]]></dc:creator><pubDate>Sat, 01 Aug 2009 20:59:57 GMT</pubDate></item><item><title><![CDATA[Reply to Header Fallen on Sat, 01 Aug 2009 21:34:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>nur ganz kurz: Ich bin ziemlich sicher, dass der Linker Dir das genau so als Fehler meldet.</p>
<p>Und allgemein: Sowas (1.) globale Variable &amp; 2.) Variablendefinition in Header) macht man eben aus genau diesen Gründen nicht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753766</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 01 Aug 2009 21:34:18 GMT</pubDate></item><item><title><![CDATA[Reply to Header Fallen on Sun, 02 Aug 2009 07:03:32 GMT]]></title><description><![CDATA[<p>Das wichtige dabei ist, dass man sich im Klaren darüber ist, was eine Deklaration und was eine Definition ist. Bzgl Variablen kann man in Header-Dateien folgendes ohne Probleme schreiben:</p>
<pre><code class="language-cpp">extern int foo;        // Deklaration einer Variablen mit externer Bindung
extern const int zzz;  // wie oben, nur unveränderlich

const int bar = 32;    // Definition einer Variablen mit interner Bindung
</code></pre>
<p>Was man dagegen nicht schreiben sollte ist</p>
<pre><code class="language-cpp">int k;  // Definition mit externer Bindung
</code></pre>
<p>da es dann die ODR (one definition rule) verletzt, sollte man diese Header-Datei in mehrere ÜEs einbinden und linken. Der Linker meckert üblicherweise in solchen Fällen.</p>
<p>Das gleiche gilt natürlich auch für Funktionen. Definitionen von Funktionen, die nicht inline sind, kein Funktionstemplate sind und auch keine interne Bindung haben, gehören nicht in Headerdateien rein.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1753857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1753857</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 02 Aug 2009 07:03:32 GMT</pubDate></item></channel></rss>