<?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[Moeglichkeiten von Makros bei Sonderzeichen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutze in meinem Programm Assembler-code. Das Programm wurde unter MSVC geschrieben. Die Syntax sieht hier so aus</p>
<pre><code class="language-cpp">__asm {
   ... Assembler-Code in Intel-Syntax ...
  }
</code></pre>
<p>also ganz einfach.</p>
<p>Nun moechte ich mein Programm aber auch mit dem Gnu-Compiler unter Linux kompilieren koennen. Leider sieht die entsprechende Sytax hier etwas spastisch aus:</p>
<pre><code class="language-cpp">__asm__(&quot;Assembler-Anweisung in AT&amp;T-Syntax&quot;);
  __asm__(&quot;naechste Assembler-Anweisung in AT&amp;T-Syntax&quot;);
  __asm__(&quot;naechste Assembler-Anweisung in AT&amp;T-Syntax&quot;);
  ...
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">__asm__(&quot;Assembler-Anweisung in AT&amp;T-Syntax;\n&quot;
          &quot;naechste Assembler-Anweisung;\n&quot;
          ...
          &quot;letzte Assembler-Anweisung;&quot;);
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">__asm__(&quot;Assembler-Anweisung in AT&amp;T-Syntax;\n \
           naechste Assembler-Anweisung;\n \
          ...
           letzte Assembler-Anweisung;&quot;);
</code></pre>
<p>Zum Glueck gibt es in den neueren GCC-Compilern einen Schalter um von der umstaendlichen AT&amp;T-Syntax auf die einfachere Intel-Syntax umzustellen.<br />
Ich moechte nun ein Makro schreiben welches in Abhaengigkeit vom benutzten Compiler unterschiedlich definiert ist, also etwa so:</p>
<pre><code class="language-cpp">#ifdef __GNUC__
  #define   ASM_BEGIN   __asm__(&quot;.intel-syntax noprefix;\n&quot;
  #define   ASM_(a)             &quot;a\n&quot;  // !!! funktioniert leider nicht !!!
  #define   ASM_END             &quot;.att-syntax noprefix\n&quot;);
#elif
  #define   ASM_BEGIN   __asm {
  #define   ASM_(a)     a
  #define   ASM_END     }
#endif
</code></pre>
<p>Soweit funktioniert's, so lange ich kein Assembler-Code mit dem ASM_(a)-Makro dazwischen packe.<br />
Das Problem ist jetzt, dass ich Assembler-Code schreibe umrahmt von Makro-Befehlen, welche dafuer sorgen, dass unter GCC Anfuehrungsszeichen gesetzt werden und unter MSVC nicht. Zum Beispiel soll</p>
<pre><code class="language-cpp">ASM_BEGIN
  ASM_(mov eax,ebx)
  ASM_END
</code></pre>
<p>zu entweder (MSVC)</p>
<pre><code class="language-cpp">__asm {
    mov  eax,ebx
  }
</code></pre>
<p>oder zu (GCC)</p>
<pre><code class="language-cpp">__asm__(&quot;.intel-syntax noprefix&quot;
          &quot;mov  eax,ebx\n&quot;
          &quot;.att-syntax noprefix&quot;);
</code></pre>
<p>werden.</p>
<p>Obige Makro-Deklararion funktioniert aber nicht, aus zwei Gruenden:<br />
1.) ich kann kein Makroargument per Makro in Anfuehrungzeichen setzen lassen, zu mindest nicht wie oben versucht.<br />
2.) Assembler-Anweisungen mit Kommata (wie im Beispiel) werden vom Preprozessor als zwei Makroargumente interpretiert nicht als eines in welchem ein Komma vorkommt.</p>
<p>Weis jemand wie ich per Makrobefehl oder irgendwie anders in Abhaengigkeit vom Compiler Anfuehrungzeichen einfuegen oder auch gesetzte Anfuehrungszeichen entfernen kann. Oder faellt jemand eine alternative Loesung zu meinem beschriebenen Problem ein?</p>
<p>Vielen Dank im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/188528/moeglichkeiten-von-makros-bei-sonderzeichen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 03:04:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/188528.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Aug 2007 12:47:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Moeglichkeiten von Makros bei Sonderzeichen on Wed, 01 Aug 2007 12:47:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutze in meinem Programm Assembler-code. Das Programm wurde unter MSVC geschrieben. Die Syntax sieht hier so aus</p>
<pre><code class="language-cpp">__asm {
   ... Assembler-Code in Intel-Syntax ...
  }
</code></pre>
<p>also ganz einfach.</p>
<p>Nun moechte ich mein Programm aber auch mit dem Gnu-Compiler unter Linux kompilieren koennen. Leider sieht die entsprechende Sytax hier etwas spastisch aus:</p>
<pre><code class="language-cpp">__asm__(&quot;Assembler-Anweisung in AT&amp;T-Syntax&quot;);
  __asm__(&quot;naechste Assembler-Anweisung in AT&amp;T-Syntax&quot;);
  __asm__(&quot;naechste Assembler-Anweisung in AT&amp;T-Syntax&quot;);
  ...
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">__asm__(&quot;Assembler-Anweisung in AT&amp;T-Syntax;\n&quot;
          &quot;naechste Assembler-Anweisung;\n&quot;
          ...
          &quot;letzte Assembler-Anweisung;&quot;);
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">__asm__(&quot;Assembler-Anweisung in AT&amp;T-Syntax;\n \
           naechste Assembler-Anweisung;\n \
          ...
           letzte Assembler-Anweisung;&quot;);
</code></pre>
<p>Zum Glueck gibt es in den neueren GCC-Compilern einen Schalter um von der umstaendlichen AT&amp;T-Syntax auf die einfachere Intel-Syntax umzustellen.<br />
Ich moechte nun ein Makro schreiben welches in Abhaengigkeit vom benutzten Compiler unterschiedlich definiert ist, also etwa so:</p>
<pre><code class="language-cpp">#ifdef __GNUC__
  #define   ASM_BEGIN   __asm__(&quot;.intel-syntax noprefix;\n&quot;
  #define   ASM_(a)             &quot;a\n&quot;  // !!! funktioniert leider nicht !!!
  #define   ASM_END             &quot;.att-syntax noprefix\n&quot;);
#elif
  #define   ASM_BEGIN   __asm {
  #define   ASM_(a)     a
  #define   ASM_END     }
#endif
</code></pre>
<p>Soweit funktioniert's, so lange ich kein Assembler-Code mit dem ASM_(a)-Makro dazwischen packe.<br />
Das Problem ist jetzt, dass ich Assembler-Code schreibe umrahmt von Makro-Befehlen, welche dafuer sorgen, dass unter GCC Anfuehrungsszeichen gesetzt werden und unter MSVC nicht. Zum Beispiel soll</p>
<pre><code class="language-cpp">ASM_BEGIN
  ASM_(mov eax,ebx)
  ASM_END
</code></pre>
<p>zu entweder (MSVC)</p>
<pre><code class="language-cpp">__asm {
    mov  eax,ebx
  }
</code></pre>
<p>oder zu (GCC)</p>
<pre><code class="language-cpp">__asm__(&quot;.intel-syntax noprefix&quot;
          &quot;mov  eax,ebx\n&quot;
          &quot;.att-syntax noprefix&quot;);
</code></pre>
<p>werden.</p>
<p>Obige Makro-Deklararion funktioniert aber nicht, aus zwei Gruenden:<br />
1.) ich kann kein Makroargument per Makro in Anfuehrungzeichen setzen lassen, zu mindest nicht wie oben versucht.<br />
2.) Assembler-Anweisungen mit Kommata (wie im Beispiel) werden vom Preprozessor als zwei Makroargumente interpretiert nicht als eines in welchem ein Komma vorkommt.</p>
<p>Weis jemand wie ich per Makrobefehl oder irgendwie anders in Abhaengigkeit vom Compiler Anfuehrungzeichen einfuegen oder auch gesetzte Anfuehrungszeichen entfernen kann. Oder faellt jemand eine alternative Loesung zu meinem beschriebenen Problem ein?</p>
<p>Vielen Dank im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1336521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1336521</guid><dc:creator><![CDATA[katana.]]></dc:creator><pubDate>Wed, 01 Aug 2007 12:47:35 GMT</pubDate></item><item><title><![CDATA[Reply to Moeglichkeiten von Makros bei Sonderzeichen on Wed, 01 Aug 2007 13:32:50 GMT]]></title><description><![CDATA[<p>Zum Ersten:</p>
<pre><code class="language-cpp">define ASM(a) #a &quot;\n&quot;
</code></pre>
<p>(# ist ein Präprozessor-Operator und setzt verwandelt sein Argument in ein String-Literal)</p>
<p>Zum Zweiten:<br />
Tut mir leid, aber afaik gibt es keine Möglichkeit, das Komma als Teil des Makros zu verwerten. Du könntest es höchstens entschärfen, indem du doppelte Klammern verwendest (aber ich weiß nicht, wie der Inline Assambler mit den zusätzlichen Klammern umgehen kann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1336556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1336556</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 01 Aug 2007 13:32:50 GMT</pubDate></item></channel></rss>