<?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 Datei mit globaler Variablendefinition]]></title><description><![CDATA[<p>Hallöchen Ihr C++ Kundigen <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="🙂"
    /></p>
<p>Wir wollten eine &quot;debug.h&quot; schreiben mit Precompiler-definitionen. Das ganze soll uns ein debuggen in unserem Programm ermöglichen (können keinen anderen funktionalen Debugger finden, da unser Proggi ein Betriebssystem ist und im bochs emuliert wird) welches von einer einzigen Datei aus steuerbar ist.</p>
<p>Die Datei schaut nun wie folgt aus:</p>
<pre><code>#ifndef debug_h
#define debug_h

// include/debug.h
// This defines a couple of cpp macros for debugging output.
// output can easily be switched of by clearing respective 
// macros at the bottom of this file. 
// written for our CoStubs implementation by Christian Bendele (2006)

// makes writing possible on the current output Channel used by main()

#include &quot;io/PrintStream.h&quot;
#include &quot;device/CgaChannel.h&quot;
#include &quot;device/CgaAttr.h&quot;

extern PrintStream out;
extern CgaChannel cga;
extern CgaAttr oldAttr;

// for general debugging output

#define _DPRINT(name,a) cga.getAttr(oldAttr); \
                        cga.setAttr(CgaAttr(CgaAttr::Yellow, CgaAttr::Black, false)); \
                        out.print(&quot;                              &quot;); \
                        out.print(name); \
                        out.print(&quot; = &quot;); \
                        out.print(a); \
                        out.print(&quot;\n&quot;); \
                        cga.setAttr(oldAttr);

// for function hints and more verbose debugging output
#define _DFPRINT(a)     cga.getAttr(oldAttr); \
                        cga.setAttr(CgaAttr(CgaAttr::Green, CgaAttr::Black, false)); \
                        out.print(&quot;                              &quot;); \
                        out.print(a); \
                        cga.setAttr(oldAttr);

// for special output prints (please just one element)
#define _DSPRINT(a)     cga.getAttr(oldAttr); \
                        cga.setAttr(CgaAttr(CgaAttr::Magenta, CgaAttr::Black, false)); \
                        out.print(a); \
                        out.print(&quot;\n&quot;); \
                        cga.setAttr(oldAttr);

// uncomment the following lines to disable parts of the debugging output

#define _DPRINT(name,a)
#define _DFPRINT(a)
#define _DSPRINT(a)

#endif
</code></pre>
<p>Die oben als extern definierten Variablen werden in unserer main() deklariert und hier genutzt. Die ersten beiden werden sowieso bei uns in der main() benötigt, daher können diese beruhigt hier als &quot;extern&quot; deklariert werden. Lediglich die &quot;CgaAttr oldAttr&quot; Variable wird nur hier benötigt (bzw. später dann in allen Dateien, denen wir das debuggen ermöglichen wollen). Wenn wir nun diese Variable nicht als extern deklarieren (also direkt hier in der header), dann bekommen wir beim Compilieren eine Menge Fehlermeldungen über eine &quot;Mehrfachdeklaration der Variable oldAttr&quot;.</p>
<p>Dieser Variablenname kommt in keiner der anderen Dateien vor und eigentlich dachte ich, diese Mehrfachdeklaration mit dem &quot;#ifndef debug_h&quot; übergangen zu haben. Aber anscheinend stört es dennoch.</p>
<p>Darf ich denn soetwas überhaupt machen, globale Variablen hier in einer separaten Header Datei deklarieren, die dann überall dort nutzbar sind, wenn diese Header Datei über &lt;#include &quot;debug.h&quot;&gt; eingebunden wurde?</p>
<p>Die ganze Datei funktioniert, sobald ich diese Variable oldAttr in unserer <a href="http://main.cc" rel="nofollow">main.cc</a> (bzw. sogar noch ausserhalb des Anweisungsblocks von <a href="http://main.cc" rel="nofollow">main.cc</a>, als globale Variable) deklariert habe und hier in der debug.h via unserem &quot;extern&quot; darauf zugreife. Dann kann ich problemlos compilieren und es funktioniert auch entsprechend.</p>
<p>Eine Idee?</p>
<p>mfg Maddin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/147425/header-datei-mit-globaler-variablendefinition</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 09:09:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147425.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 May 2006 17:31:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Header Datei mit globaler Variablendefinition on Tue, 16 May 2006 17:31:05 GMT]]></title><description><![CDATA[<p>Hallöchen Ihr C++ Kundigen <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="🙂"
    /></p>
<p>Wir wollten eine &quot;debug.h&quot; schreiben mit Precompiler-definitionen. Das ganze soll uns ein debuggen in unserem Programm ermöglichen (können keinen anderen funktionalen Debugger finden, da unser Proggi ein Betriebssystem ist und im bochs emuliert wird) welches von einer einzigen Datei aus steuerbar ist.</p>
<p>Die Datei schaut nun wie folgt aus:</p>
<pre><code>#ifndef debug_h
#define debug_h

// include/debug.h
// This defines a couple of cpp macros for debugging output.
// output can easily be switched of by clearing respective 
// macros at the bottom of this file. 
// written for our CoStubs implementation by Christian Bendele (2006)

// makes writing possible on the current output Channel used by main()

#include &quot;io/PrintStream.h&quot;
#include &quot;device/CgaChannel.h&quot;
#include &quot;device/CgaAttr.h&quot;

extern PrintStream out;
extern CgaChannel cga;
extern CgaAttr oldAttr;

// for general debugging output

#define _DPRINT(name,a) cga.getAttr(oldAttr); \
                        cga.setAttr(CgaAttr(CgaAttr::Yellow, CgaAttr::Black, false)); \
                        out.print(&quot;                              &quot;); \
                        out.print(name); \
                        out.print(&quot; = &quot;); \
                        out.print(a); \
                        out.print(&quot;\n&quot;); \
                        cga.setAttr(oldAttr);

// for function hints and more verbose debugging output
#define _DFPRINT(a)     cga.getAttr(oldAttr); \
                        cga.setAttr(CgaAttr(CgaAttr::Green, CgaAttr::Black, false)); \
                        out.print(&quot;                              &quot;); \
                        out.print(a); \
                        cga.setAttr(oldAttr);

// for special output prints (please just one element)
#define _DSPRINT(a)     cga.getAttr(oldAttr); \
                        cga.setAttr(CgaAttr(CgaAttr::Magenta, CgaAttr::Black, false)); \
                        out.print(a); \
                        out.print(&quot;\n&quot;); \
                        cga.setAttr(oldAttr);

// uncomment the following lines to disable parts of the debugging output

#define _DPRINT(name,a)
#define _DFPRINT(a)
#define _DSPRINT(a)

#endif
</code></pre>
<p>Die oben als extern definierten Variablen werden in unserer main() deklariert und hier genutzt. Die ersten beiden werden sowieso bei uns in der main() benötigt, daher können diese beruhigt hier als &quot;extern&quot; deklariert werden. Lediglich die &quot;CgaAttr oldAttr&quot; Variable wird nur hier benötigt (bzw. später dann in allen Dateien, denen wir das debuggen ermöglichen wollen). Wenn wir nun diese Variable nicht als extern deklarieren (also direkt hier in der header), dann bekommen wir beim Compilieren eine Menge Fehlermeldungen über eine &quot;Mehrfachdeklaration der Variable oldAttr&quot;.</p>
<p>Dieser Variablenname kommt in keiner der anderen Dateien vor und eigentlich dachte ich, diese Mehrfachdeklaration mit dem &quot;#ifndef debug_h&quot; übergangen zu haben. Aber anscheinend stört es dennoch.</p>
<p>Darf ich denn soetwas überhaupt machen, globale Variablen hier in einer separaten Header Datei deklarieren, die dann überall dort nutzbar sind, wenn diese Header Datei über &lt;#include &quot;debug.h&quot;&gt; eingebunden wurde?</p>
<p>Die ganze Datei funktioniert, sobald ich diese Variable oldAttr in unserer <a href="http://main.cc" rel="nofollow">main.cc</a> (bzw. sogar noch ausserhalb des Anweisungsblocks von <a href="http://main.cc" rel="nofollow">main.cc</a>, als globale Variable) deklariert habe und hier in der debug.h via unserem &quot;extern&quot; darauf zugreife. Dann kann ich problemlos compilieren und es funktioniert auch entsprechend.</p>
<p>Eine Idee?</p>
<p>mfg Maddin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1059066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1059066</guid><dc:creator><![CDATA[kruemeltee]]></dc:creator><pubDate>Tue, 16 May 2006 17:31:05 GMT</pubDate></item><item><title><![CDATA[Reply to Header Datei mit globaler Variablendefinition on Tue, 16 May 2006 18:00:18 GMT]]></title><description><![CDATA[<p>Das Problem ist dass Du die Funktion des Include-Guards nicht vollständig erfasst hast. Er verhindert, dass ein Header während einer Compilierung mehrmals inkludiert wird (z.B. durch andere Header). Wenn Du jedoch 5 Dateien compilierst, die alle mindestens einmal debug.h includen, so hast Du in allen 5 Dateien genau einmal diese Variable, die nicht mit extern markiert ist.</p>
<p>Daraus folgt die Antwort auf Deine Frage, nämlich dass das keine besonders gute Idee ist, eine Variable in einem Header vollständig zu definieren.</p>
<p>Vorschlag: Fügt Eurem Projekt doch eine debug.c hinzu wo solche Variablen definiert werden, und im Header bleibt dann die extern-Deklaration.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1059076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1059076</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 16 May 2006 18:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to Header Datei mit globaler Variablendefinition on Tue, 16 May 2006 18:26:22 GMT]]></title><description><![CDATA[<p>aber wird denn nicht durch das &quot;#ifndef debug_h&quot; eben dieses verhindert? D.h. wenn debug_h schon einmal definiert wurde, dann wird das nicht mehr gemacht?</p>
<p>Aber trotzdem danke für den Vorschlag mit der debug.c ... wenns nicht anders geht, werd ich das wohl auch so machen <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="🙂"
    /></p>
<p>mfg maddin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1059093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1059093</guid><dc:creator><![CDATA[kruemeltee]]></dc:creator><pubDate>Tue, 16 May 2006 18:26:22 GMT</pubDate></item><item><title><![CDATA[Reply to Header Datei mit globaler Variablendefinition on Tue, 16 May 2006 19:44:48 GMT]]></title><description><![CDATA[<p>Wie gesagt die Include-Guards schützen nur vor Inclusion in <strong>einem</strong> compilierten File. Der Präprozessor kann garnicht mehr als über eine einzige .cpp Datei arbeiten, von dem Kontext in dem da kompiliert wird hat der keine Ahnung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1059134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1059134</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 16 May 2006 19:44:48 GMT</pubDate></item></channel></rss>