<?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[Auswertung von #defines &#x2F; #includes - Reihenfolge?]]></title><description><![CDATA[<p>Hio,</p>
<p>ich bin heute morgen über ein &quot;interessantes&quot; Verhalten gestolpert, das Ihr mir hoffentlich erklären könnt:</p>
<p>Ich habe eine kleine library, die mir die Kommunikation mit einem Server ermöglicht und Funktionen am Server aufruft. Damit ich gegebenenfalls neue Funktionen implementieren kann, compiliere ich alles selber (ist überschaubar wenig). Anscheinend unterstütz die<br />
library verschiedene Funktionsmodi, die ich mit #defines einstellen kann:</p>
<pre><code class="language-cpp">#ifdef NON_MATLAB_PARSING /* when compiling, make sure NON_MATLAB_PARSING is always defined! */
        ....
#else 
	....
#endif /* else NON_MATLAB_PARSING */
</code></pre>
<p>Also habe ich kurzerhand NON_MATLAB_PARSING in meiner main.cpp zum Testen definiert:</p>
<pre><code class="language-cpp">#define NON_MATLAB_PARSING
#include &quot;HeaderDerLib.h&quot;
...
</code></pre>
<p>..und bekam eine ganze Menge Syntaxfehler.</p>
<p>Wenn ich nun folgendes im Header mache:</p>
<pre><code class="language-cpp">#define NON_MATLAB_PARSING
#ifdef NON_MATLAB_PARSING /* when compiling, make sure NON_MATLAB_PARSING is always defined! */
        ....
#else 
	....
#endif /* else NON_MATLAB_PARSING */
</code></pre>
<p>geht alles ohne Probleme!</p>
<p>Haben #defines einen bestimmten Geltungsbereich oder so? Ich habe schon das Projekt durchsucht und NON_MATLAB_PARSING wird weder undefiniert, noch irgendetwas damit gemacht. Es wird auch nur in dieser einen Header-Datei benutzt. Die Reihenfolge sollte ja stimmen oder kann es sein, dass die #include Direktive VOR der #define Direktive abgearbeitet wird ?</p>
<p>Gruß</p>
<p>Pille456</p>
<p>P.S: Habs mit VS 2010 getestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311237/auswertung-von-defines-includes-reihenfolge</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 16:43:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311237.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Nov 2012 11:48:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 11:48:47 GMT]]></title><description><![CDATA[<p>Hio,</p>
<p>ich bin heute morgen über ein &quot;interessantes&quot; Verhalten gestolpert, das Ihr mir hoffentlich erklären könnt:</p>
<p>Ich habe eine kleine library, die mir die Kommunikation mit einem Server ermöglicht und Funktionen am Server aufruft. Damit ich gegebenenfalls neue Funktionen implementieren kann, compiliere ich alles selber (ist überschaubar wenig). Anscheinend unterstütz die<br />
library verschiedene Funktionsmodi, die ich mit #defines einstellen kann:</p>
<pre><code class="language-cpp">#ifdef NON_MATLAB_PARSING /* when compiling, make sure NON_MATLAB_PARSING is always defined! */
        ....
#else 
	....
#endif /* else NON_MATLAB_PARSING */
</code></pre>
<p>Also habe ich kurzerhand NON_MATLAB_PARSING in meiner main.cpp zum Testen definiert:</p>
<pre><code class="language-cpp">#define NON_MATLAB_PARSING
#include &quot;HeaderDerLib.h&quot;
...
</code></pre>
<p>..und bekam eine ganze Menge Syntaxfehler.</p>
<p>Wenn ich nun folgendes im Header mache:</p>
<pre><code class="language-cpp">#define NON_MATLAB_PARSING
#ifdef NON_MATLAB_PARSING /* when compiling, make sure NON_MATLAB_PARSING is always defined! */
        ....
#else 
	....
#endif /* else NON_MATLAB_PARSING */
</code></pre>
<p>geht alles ohne Probleme!</p>
<p>Haben #defines einen bestimmten Geltungsbereich oder so? Ich habe schon das Projekt durchsucht und NON_MATLAB_PARSING wird weder undefiniert, noch irgendetwas damit gemacht. Es wird auch nur in dieser einen Header-Datei benutzt. Die Reihenfolge sollte ja stimmen oder kann es sein, dass die #include Direktive VOR der #define Direktive abgearbeitet wird ?</p>
<p>Gruß</p>
<p>Pille456</p>
<p>P.S: Habs mit VS 2010 getestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276052</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Fri, 30 Nov 2012 11:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 12:05:05 GMT]]></title><description><![CDATA[<p>Spontan würde ich sagen: du inkludierst die Datei einmal mit definiertem NON_MATLAB_PARSING und einmal ohne.</p>
<p>Und das beisst sich.</p>
<p>Ist aber ins blaue hinein geraten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276057</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 30 Nov 2012 12:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 12:07:22 GMT]]></title><description><![CDATA[<p>Solche defines übergibt man dem Compiler direkt. In Visual Studio wird das in den Projekteigenschaften C/C++-&gt;Preprocessor und dann in Preprocessor Definitions gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276060</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 30 Nov 2012 12:07:22 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 12:28:19 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Spontan würde ich sagen: du inkludierst die Datei einmal mit definiertem NON_MATLAB_PARSING und einmal ohne.</p>
<p>Und das beisst sich.</p>
<p>Ist aber ins blaue hinein geraten.</p>
</blockquote>
<p>Dann würde die Reihenfolge in irgendeiner Art und Weise eine Rolle spielen, denn ich rufe #define NON_MATLAB_PARSING als aller erster in der main.cpp auf (noch vor irgendetwas anderem).</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Solche defines übergibt man dem Compiler direkt. In Visual Studio wird das in den Projekteigenschaften C/C++-&gt;Preprocessor und dann in Preprocessor Definitions gemacht.</p>
</blockquote>
<p>Wusste ich nicht, funkt aber aufjedenfall.</p>
<p>Falls jemand eine klare Antwort für dieses Problem hat, immer her damit. Ansonsten verbuche ich das mal unter &quot;MS VS 2010 Eigenart&quot;.</p>
<p>Danke für den Tipp!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276064</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Fri, 30 Nov 2012 12:28:19 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 12:37:11 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Falls jemand eine klare Antwort für dieses Problem hat, immer her damit.</p>
</blockquote>
<p>Die Antwort wird sein, dass du irgendwo irgendetwas vergessen hast. Der Code den du hier zeigst, wird wohl nicht 1:1 das beobachtete Verhalten erzeugen. Zeig mal ein vollständiges Beispiel, bei dem du auch getestet hat, dass es sich tatsächlich unerwartet verhält.</p>
<blockquote>
<p>Ansonsten verbuche ich das mal unter &quot;MS VS 2010 Eigenart&quot;.</p>
</blockquote>
<p>Nein. Glaubst du wirklich, DU hättest einen nicht-dokumentierten Fehler in einem häufig genutzten Teil eines weit verbreiteten Programms gefunden, wenn die Möglichkeit, dass der Fehler bei dir liegen könnte, nicht ausgeschlossen ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276068</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 30 Nov 2012 12:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 12:52:14 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>Dann würde die Reihenfolge in irgendeiner Art und Weise eine Rolle spielen, denn ich rufe #define NON_MATLAB_PARSING als aller erster in der main.cpp auf (noch vor irgendetwas anderem).</p>
</blockquote>
<p>Definiere &quot;als aller erstes&quot;</p>
<p>Einzelne .cpp Files werden z.B. unabhängig voneinander kompiliert, von einer &quot;Reihenfolge&quot; zu reden macht in dem Zusammenhang gar keinen Sinn...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276072</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 30 Nov 2012 12:52:14 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 13:03:29 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich sage nicht, dass es unbedingt an MS VS 2010 liegen muss. Vielleicht liegt es auch an der library die ich nutze, aber den Fehler konnte ich auf die Schnelle nicht finden, zumal es ja anscheinend mit 2 anderen Methoden funktioniert. Wahrscheinlich liegt der Fehler sogar bei mir, sonst würde ich ja hier nicht fragen <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="🙂"
    /><br />
Ich will ja wissen, wo das Problem liegt oder ob es tatsächlich einfach eine Eigenart ist. Der gcc Verhält sich ja auch manchmal anders, als VS. Kann ja sein, dass das Verhalten gar nicht genau definiert ist. Muss ja nicht immer gleich ein Bug sein.<br />
Folgendes Beispiel geht nicht:</p>
<pre><code>// Reihenfolge scheint hier aber egal zu sein
#define NON_MATLAB_PARSING
#include &quot;extApi.h&quot;
#include &lt;iostream&gt;
#include &lt;conio.h&gt;

int main(int argc, char* argv[]) {
	std :: cout &lt;&lt; &quot;Hallo Welt&quot; &lt;&lt; std :: endl;
	_getch();
}
</code></pre>
<p>Die Solution wurde mit cmake erstellt:</p>
<pre><code>cmake_minimum_required(VERSION 2.6)
project(TestAPI)

set(SOURCES
    src/main.cpp
	src/extApi.c
	src/extApiCustom.c
	src/extApiPlatform.c
)

set(HEADERS
    include/extApi.h
	include/extApiCustom.h
	include/extApiInternal.h
	include/extApiPlatform.h
	include/extApiCustomConst.h
	include/v_repConst.h
	include/v_repLib.h
)

include_directories(&quot;include/&quot;)
#add_definitions( -DNON_MATLAB_PARSING ) # hiermit gehts

add_executable(
    TestAPI
    ${SOURCES}
    ${HEADERS}
)
</code></pre>
<p>Aufbau des Projekts sieht so aus:</p>
<pre><code>root
 + vs
 + qtcreator
 + src
 + include
 - CMakeList.txt
</code></pre>
<p>In src und include sind die header und cpp Dateien aufgeteilt. Die lib ist Teil von V-REP (<a href="http://www.v-rep.eu/" rel="nofollow">http://www.v-rep.eu/</a>), einem Programm zur Simulation von Robotern (ähnlich Player/Stage oder MS robotics studio). Auch wenn V-REP closed source ist, sind die Remote API Funktionen als cpp/h Dateien verfügbar, damit diese bei Bedarf erweitert werden können.<br />
Ich will jetzt hier nicht Datei posten, konkret gehts aber um die extApi.h:</p>
<pre><code>#ifndef _EXTAPI__
#define _EXTAPI__

#ifdef NON_MATLAB_PARSING /* when compiling, make sure NON_MATLAB_PARSING is always defined! */
	#include &quot;extApiPlatform.h&quot;
	#include &quot;v_repConst.h&quot;
#else 
	typedef char simxChar;
	typedef short simxShort;
	typedef unsigned short simxUShort;	
	typedef int simxInt;
	typedef unsigned int simxUInt;
	typedef float simxFloat;
	typedef void simxVoid;
#endif /* else NON_MATLAB_PARSING */

#ifdef _WIN32
	#define EXTAPI_DLLEXPORT extern __declspec(dllexport)
#endif
#if defined (__linux) || defined (__APPLE__)
	#define EXTAPI_DLLEXPORT extern
#endif

/* Use following to test endianness detection on little endian machines (endianness of the client is handled on the server side)
#define ENDIAN_TEST
*/

#ifdef NON_MATLAB_PARSING

// einige Funktionsdeklarationen, nach Kommentar: /* Various other functions, not to be called directly */

#endif /* NON_MATLAB_PARSING */

//ganz viele Funktionsdeklarationen, HIER treten später die Syntaxfehler (unerkennbar mittendrin) auf
//Soweit ich das sehe werden hier keine Funktionen redefiniert o.Ä. Nach Kommentar: /* The remote API functions */
</code></pre>
<p>Die inkludierten extApiPlatorform.h und v_repConst.h enthalten diverse enums/const/define Deklarationen. Dort kommt jedoch niergens NON_MATLAB_PARSING vor.</p>
<p>dot schrieb:</p>
<blockquote>
<p>Definiere &quot;als aller erstes&quot;</p>
<p>Einzelne .cpp Files werden z.B. unabhängig voneinander kompiliert, von einer &quot;Reihenfolge&quot; zu reden macht in dem Zusammenhang gar keinen Sinn...</p>
</blockquote>
<p>In diese Richtung zielte meine Frage, ob es dort eine Reihenfolge gibt oder eben nicht. Da die main.cpp meine main() enthält gehe ich davon aus, dass der compiler diese zuerst parst. Und dort wird er (siehe oben) als erstes ein #define finden.</p>
<p>Gruß<br />
Pille456</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276075</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Fri, 30 Nov 2012 13:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 13:11:36 GMT]]></title><description><![CDATA[<p>Naja, da haben wir's ja schon, dein Projekt besteht also aus den Dateien main.cpp, extApi.c, extApiCustom.c und extApiPlatform.c. Du definierst NON_MATLAB_PARSING aber nur in main.cpp, was eben dazu führt, dass main.cpp für NON_MATLAB_PARSING kompiliert wird, die restlichen Dateien aber nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276078</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 30 Nov 2012 13:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 13:12:20 GMT]]></title><description><![CDATA[<p>Pille456 schrieb:</p>
<blockquote>
<p>In diese Richtung zielte meine Frage, ob es dort eine Reihenfolge gibt oder eben nicht. Da die main.cpp meine main() enthält gehe ich davon aus, dass der compiler diese zuerst parst. Und dort wird er (siehe oben) als erstes ein #define finden.</p>
</blockquote>
<p>Die Reihenfolge ist egal. Auf Mehrkernsystemen können durchaus alle deine Dateien gleichzeitig compiliert werden. Der Präprozessor übernimmt keine Definitionen von einer Quellcodedatei zur anderen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276079</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 30 Nov 2012 13:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to Auswertung von #defines &#x2F; #includes - Reihenfolge? on Fri, 30 Nov 2012 13:14:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>danke für Euren 3 Antworten in so kurzer Zeit <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 />
Mir war nicht bewusst, dass das total unabhängig voneinander kompiliert werden kann, dachte der compiler beginnt zumindest bei der main() function, bevor er sich den Rest vornimmt. Wieder was gelernt. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276082</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Fri, 30 Nov 2012 13:14:28 GMT</pubDate></item></channel></rss>