<?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[Konstante in separater Datei]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich habe ein Problem mit Konstanten.</p>
<p>Ich habe 3 Dateien haupt.cpp , general.cpp, general.h und möchte eine Konstante nun in den Dateien general.cpp und haupt.cpp verwenden können.</p>
<p>Folgenden Code habe ich, allerdings gibt es einen multiple Definitions Fehler.</p>
<p>haupt.cpp</p>
<pre><code class="language-cpp">#include&quot;general.h&quot;
int main()
{
   return 0;
}
</code></pre>
<p>general.h</p>
<pre><code class="language-cpp">const char* X = &quot;Hallo&quot;;
</code></pre>
<p>general.cpp</p>
<pre><code class="language-cpp">#include&quot;general.h&quot;
</code></pre>
<p>Der Fehler kommt wegen der Definition der Konstanten in der Header-Datei. Aber wo soll ich die Konstante denn hin packen, damit das ganze funktioniert?</p>
<p>Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261861/konstante-in-separater-datei</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 02:47:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261861.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Feb 2010 20:31:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:31:51 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich habe ein Problem mit Konstanten.</p>
<p>Ich habe 3 Dateien haupt.cpp , general.cpp, general.h und möchte eine Konstante nun in den Dateien general.cpp und haupt.cpp verwenden können.</p>
<p>Folgenden Code habe ich, allerdings gibt es einen multiple Definitions Fehler.</p>
<p>haupt.cpp</p>
<pre><code class="language-cpp">#include&quot;general.h&quot;
int main()
{
   return 0;
}
</code></pre>
<p>general.h</p>
<pre><code class="language-cpp">const char* X = &quot;Hallo&quot;;
</code></pre>
<p>general.cpp</p>
<pre><code class="language-cpp">#include&quot;general.h&quot;
</code></pre>
<p>Der Fehler kommt wegen der Definition der Konstanten in der Header-Datei. Aber wo soll ich die Konstante denn hin packen, damit das ganze funktioniert?</p>
<p>Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860803</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:31:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:33:59 GMT]]></title><description><![CDATA[<p>Include Guards haste drin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860804</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:35:37 GMT]]></title><description><![CDATA[<p>Weil du general.h in mehreren Dateien einbindest wird deine Konstante mehrmals (nämlich mit jedem Einbinden) definiert. Deshalb setzt man um den Header meistens noch eine if-Bedingung. Das sähe dann so aus:</p>
<p>general.h</p>
<pre><code class="language-cpp">#ifndef GENERAL_H
#define GENERAL_H

const char* X = &quot;Hallo&quot;;

#endif
</code></pre>
<p>Dann müsste es eigentlich funktionieren</p>
<p>Grüße</p>
<p>Edit: Das sind dann quasi die &quot;Include-Guards&quot; <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/1860806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860806</guid><dc:creator><![CDATA[ichben]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:36:10 GMT]]></title><description><![CDATA[<p>du meinst</p>
<pre><code class="language-cpp">#ifndef X
#define X
#endif
</code></pre>
<p>?</p>
<p>Ja ist in der Header Datei drin.<br />
Mit diesen Direktiven gehts trotzdem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860807</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:36:51 GMT]]></title><description><![CDATA[<p>Besser ist es, wenn du in die Guards den Namen deiner .h-Datei packst (siehe mein Beispiel) - dann müsste es auch funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860808</guid><dc:creator><![CDATA[ichben]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:36:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:38:51 GMT]]></title><description><![CDATA[<p>Edit: was ist denn die genaue Fehlermeldung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860809</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:38:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:43:32 GMT]]></title><description><![CDATA[<p>Also nur zum verständnis: In der Header datei als</p>
<pre><code class="language-cpp">static const char* X = &quot;Hallo&quot;;
</code></pre>
<p>deklarieren?</p>
<p>Was hat das static da für eine Funktion, das versteh ich nicht so ganz. Gibt das static dem Compiler zu verstehen, dass diese Variable für alle Übersetzungseinheiten gleich ist?</p>
<p>Genaue Fehlermeldung:</p>
<blockquote>
<p>error LNK2005: &quot;char const * const X&quot; (?X@@3PBDB) already defined in Haupt.obj<br />
fatal error LNK1169: one or more multiply defined symbols found</p>
</blockquote>
<p>Edit: Mit static funktionierts, aber warum das funktioniert ist mir nicht ganz klar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860811</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:46:03 GMT]]></title><description><![CDATA[<p>Da diese Frage immer wieder falsch beantwortet wird: <strong>Linkerfehler haben in erster Linie nichts mit Include-Guards zu tun!</strong></p>
<p>Das Problem ist, dass die Variable mehrfach definiert wird. In den Header gehört eine Deklaration:</p>
<pre><code class="language-cpp">extern const char* const X; // das 2. const macht den Zeiger erst konstant
</code></pre>
<p>In einer Implementierungsdatei muss die Definition stehen:</p>
<pre><code class="language-cpp">extern const char* const X = &quot;hallo&quot;;
</code></pre>
<p>Bei Konstanten könnte man auch interne Bindung nutzen (indem man keine Speicherklasse angibt), aber dann wird die Variable für jedes Modul einzeln erstellt. Das gleiche Verhalten erreicht man mit der Speicherklasse <code>static</code> .</p>
<p>Übrigens sollte man stets versuchen, globale Variablen zu vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860814</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:46:05 GMT]]></title><description><![CDATA[<p>Warum funktioniert aber eine Konstantendefinition für einfache Datentypen wie const int auch mit Zuweisung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860817</guid><dc:creator><![CDATA[ichben]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:47:04 GMT]]></title><description><![CDATA[<p>Ok, danke Nexus, hätte aber noch 2 Fragen:</p>
<ol>
<li>Warum gibt er mir bei static keinen Fehler? Also wenn ich in der Header Datei</li>
</ol>
<pre><code class="language-cpp">static const char* X = &quot;Hallo&quot;;
</code></pre>
<p>schreibe?</p>
<ol start="2">
<li>Für was steht denn in</li>
</ol>
<pre><code class="language-cpp">const char* const X
</code></pre>
<p>das erste const?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860818</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:47:39 GMT]]></title><description><![CDATA[<p>ichben schrieb:</p>
<blockquote>
<p>Warum funktioniert aber eine Konstantendefinition für einfache Datentypen wie const int auch mit Zuweisung?</p>
</blockquote>
<p>Wie angetönt: Weil <code>const</code> -qualifizierte globale Variablen standardmässig (d.h. ohne explizite Angabe einer Speicherklasse) intern gelinkt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860819</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:47:39 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:51:21 GMT]]></title><description><![CDATA[<p>Variablen, die static sind, existieren nur in dieser Übersetzungseinheit und sind von anderen ÜE aus nicht erreichbar, dafür kannst du den gleichen Namen auch in anderen ÜE verwenden.<br />
Das bedeutet zwar, dass die Variable in jeder ÜE einmal existiert, aber die meisten Linker führen z.B. gleiche Stringkonstanten zusammen, so dass sie nur einmal im Binary auftauchen.</p>
<p>Don Quijote schrieb:</p>
<blockquote>
<ol start="2">
<li>Für was steht denn in</li>
</ol>
<pre><code class="language-cpp">const char* const X
</code></pre>
<p>das erste const?</p>
</blockquote>
<p>Das erste const bezieht sich auf das char - d.h. es handelt sich um einen Zeiger auf ein konstantes char. Erst das zweite const macht auch den Zeiger selbst konstant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860822</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:50:41 GMT]]></title><description><![CDATA[<p>Don Quijote schrieb:</p>
<blockquote>
<ol>
<li>Warum gibt er mir bei static keinen Fehler? Also wenn ich in der Header Datei</li>
</ol>
<pre><code class="language-cpp">static const char* X = &quot;Hallo&quot;;
</code></pre>
<p>schreibe?</p>
</blockquote>
<p>Weil du durch das <code>static</code> explizit eine nicht-konstante Variable mit interner Linkage versiehst. Der Linker erstellt eine unabhängige Variable pro Modul.</p>
<p>Don Quijote schrieb:</p>
<blockquote>
<ol start="2">
<li>Für was steht denn in</li>
</ol>
<pre><code class="language-cpp">const char* const X
</code></pre>
<p>das erste const?</p>
</blockquote>
<p>Das bezieht sich auf das <code>char</code> , auf das der Zeiger verweist (und nicht etwa auf den Zeiger selbst). Wenn du <code>X</code> dereferenzierst, erhältst du Zugriff auf <code>const char</code> , d.h. du kannst die Zeichen nicht verändern. Das ist bei Stringliteralen wie <code>&quot;Hallo&quot;</code> auch sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860824</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:52:44 GMT]]></title><description><![CDATA[<p>Na klar, macht Sinn,</p>
<p>Vielen Dank an alle Beteiligten.</p>
<p>btw.: Das hier hab ich noch nie in irgendeinem Tutorial gelesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860826</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 20:57:11 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Variablen, die static sind, existieren nur in dieser Übersetzungseinheit und sind von anderen ÜE aus nicht erreichbar, dafür kannst du den gleichen Namen auch in anderen ÜE verwenden.</p>
</blockquote>
<p>Ja. <code>static</code> in Headern ist aber eher ungewöhnlich. Das Problem ist eher relevant, wenn man in einer Implementierungsdatei ein globales Symbol erstellt, welches sich mit Bezeichnern in anderen Modulen überschneiden könnte. Dann empfehlen sich übrigens anonyme Namensräume.</p>
<p>Athar schrieb:</p>
<blockquote>
<p>Das bedeutet zwar, dass die Variable in jeder ÜE einmal existiert, aber die meisten Linker führen z.B. gleiche Stringkonstanten zusammen, so dass sie nur einmal im Binary auftauchen.</p>
</blockquote>
<p>Du musst hier vorsichtig sein, dass du nicht zwei Dinge vermischst: Stringliterale, welche das Programm im statischen Speicherbereich hält, und globale Variablen (hier Zeiger, die auf Stringliterale verweisen). Die Speicherklasse von Variablen kann der Programmierer beeinflussen, die von Stringliteralen nicht.</p>
<p>Don Quijote schrieb:</p>
<blockquote>
<p>btw.: Das hier hab ich noch nie in irgendeinem Tutorial gelesen.</p>
</blockquote>
<p>Sinnvoller wäre es auch, du würdest ein Buch lesen. Du wirst noch einiges von C++ nicht mitkriegen, wenn du dein Wissen aus Internettutorials zusammensammelst. Oft empfohlen werden z.B. der <em>C++ Primer</em> oder <em>Thinking in C++</em> (auch gratis als Online-PDF erhältlich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860831</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Feb 2010 20:57:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 21:06:50 GMT]]></title><description><![CDATA[<p>Ok, hab mich vlt. falsch ausgedrückt, ich habe bereits ein Buch gelesen, allerdings eher für Anfänger. Trotzdem danke für den Tipp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860836</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Wed, 24 Feb 2010 21:06:50 GMT</pubDate></item><item><title><![CDATA[Reply to Konstante in separater Datei on Wed, 24 Feb 2010 21:10:00 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du musst hier vorsichtig sein, dass du nicht zwei Dinge vermischst: Stringliterale, welche das Programm im statischen Speicherbereich hält, und globale Variablen (hier Zeiger, die auf Stringliterale verweisen). Die Speicherklasse von Variablen kann der Programmierer beeinflussen, die von Stringliteralen nicht.</p>
</blockquote>
<p>Aber auch hier gilt, dass kein physischer Speicher für die Variablen bereitgestellt werden muss, sofern deren Adresse nicht angefordert wird.<br />
Letztendlich wollte ich darauf hinaus, dass static nicht unbedingt die Binarygröße erhöhen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1860839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1860839</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 24 Feb 2010 21:10:00 GMT</pubDate></item></channel></rss>