<?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[(Visual) C++ Präprozessor -&amp;gt; String Operationen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich möchte in ein char Array bestimmte Compiler-Eigenschaften speichern.<br />
Also sowas in der Art:</p>
<p>const char MeinArray[] = sizeof(int);</p>
<p>Nur soll nicht der integer Wert gespeichert werden sondern der (Zahlen-)Wert als String... (also sowas wie itoa)<br />
Das Array soll schon am Anfang des Programmes existieren und nicht erst zur Laufzeit erzeugt werden (also kein sprintf()).</p>
<p>Ist sowas möglich?</p>
<p>Danke &amp; Gruß,</p>
<p>Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/188957/visual-c-präprozessor-gt-string-operationen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 07:10:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/188957.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Aug 2007 20:05:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Mon, 06 Aug 2007 20:05:32 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich möchte in ein char Array bestimmte Compiler-Eigenschaften speichern.<br />
Also sowas in der Art:</p>
<p>const char MeinArray[] = sizeof(int);</p>
<p>Nur soll nicht der integer Wert gespeichert werden sondern der (Zahlen-)Wert als String... (also sowas wie itoa)<br />
Das Array soll schon am Anfang des Programmes existieren und nicht erst zur Laufzeit erzeugt werden (also kein sprintf()).</p>
<p>Ist sowas möglich?</p>
<p>Danke &amp; Gruß,</p>
<p>Mark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1339804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1339804</guid><dc:creator><![CDATA[pub00515]]></dc:creator><pubDate>Mon, 06 Aug 2007 20:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Mon, 06 Aug 2007 20:16:33 GMT]]></title><description><![CDATA[<p>Edit: Schrott -.-<br />
Ich sollte erst den ganzen Post lesen bevor ich antworte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1339806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1339806</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Mon, 06 Aug 2007 20:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Mon, 06 Aug 2007 20:16:52 GMT]]></title><description><![CDATA[<p>Nein, das ist nicht möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1339807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1339807</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Mon, 06 Aug 2007 20:16:52 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Mon, 06 Aug 2007 20:19:40 GMT]]></title><description><![CDATA[<p>Hmmm also eine Zahl in einen String zu kriegen kann man ja mittels so einem Makro:</p>
<pre><code class="language-cpp">#define STRING(x) #x
</code></pre>
<p>Nur wird sizeof() nicht evaluiert, d.h. es steht wirklich &quot;sizeof(int)&quot; im char Array <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1339809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1339809</guid><dc:creator><![CDATA[pub00515]]></dc:creator><pubDate>Mon, 06 Aug 2007 20:19:40 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Mon, 06 Aug 2007 20:20:56 GMT]]></title><description><![CDATA[<p>Nein. Weder mit Präprozessor noch mit Templates.</p>
<p>Wenn du die Daten unbedingt als String haben willst (was ich gerade nicht so ganz nachvollziehen kann), dann schreib dir doch eine kleines Ba(sh|tch)skript, dass ein Programm der Art</p>
<pre><code class="language-cpp">int main ()
{
    std::cout &lt;&lt; &quot;sizeof(int) = &quot; sizeof (int) &lt;&lt; ' ' &lt;&lt; etc.
}
</code></pre>
<p>kompiliert, ausführt und die Ausgabe in eine andere Datei schreibt, umgeben von Anführungszeichen.</p>
<p>Diese Datei kannst du dann in deinem Progamm inkludieren und benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1339812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1339812</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 06 Aug 2007 20:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Tue, 07 Aug 2007 03:28:57 GMT]]></title><description><![CDATA[<p>Die &quot;einfache&quot; Version mit Templates:</p>
<pre><code class="language-cpp">template &lt;bool S, class A, class B&gt; struct sel;

template &lt;class A, class B&gt; struct sel&lt;true, A, B&gt;
{
	typedef A type;
};

template &lt;class A, class B&gt; struct sel&lt;false, A, B&gt;
{
	typedef B type;
};

// --------------------------------------------------------------------------

template &lt;char A1, char A2 = 0, char A3 = 0, char A4 = 0, char A5 = 0, char A6 = 0&gt; struct strx
{
	static char const value[7];
};

template &lt;char A1, char A2, char A3, char A4, char A5, char A6&gt; char const strx&lt;A1, A2, A3, A4, A5, A6&gt;::value[7] = {A1, A2, A3, A4, A5, A6, 0};

// --------------------------------------------------------------------------

struct errx {};

// --------------------------------------------------------------------------

template &lt;unsigned N&gt; struct foo_
	:	sel&lt;(N &lt; 10), strx&lt;N+'0'&gt;,
		typename sel&lt;(N &lt; 100), strx&lt;(N/10)+'0', (N%10)+'0'&gt;,
		typename sel&lt;(N &lt; 1000), strx&lt;(N/100)+'0', (N/10)%10+'0', (N%10)+'0'&gt;,
		typename sel&lt;(N &lt; 10000), strx&lt;(N/1000)+'0', (N/100)%10+'0', (N/10)%10+'0', (N%10)+'0'&gt;,
		typename sel&lt;(N &lt; 100000), strx&lt;(N/10000)+'0', (N/1000)%10+'0', (N/100)%10+'0', (N/10)%10+'0', (N%10)+'0'&gt;,
		typename sel&lt;(N &lt; 1000000), strx&lt;(N/100000)+'0', (N/10000)%10+'0', (N/1000)%10+'0', (N/100)%10+'0', (N/10)%10+'0', (N%10)+'0'&gt;, errx
		&gt;::type&gt;::type&gt;::type&gt;::type&gt;::type&gt;::type
{
};

struct bar
{
	char c[123];
};

int main() 
{
	printf(&quot;%s\n&quot;, foo_&lt;sizeof(bar)&gt;::value);
}
</code></pre>
<p>Wer grössere Zahlen braucht muss entsprechend mehr tippen.<br />
Was IMO nicht geht ist dem Array einen selbstgewählten Namen zu geben, aber man kann immernoch einen Zeiger auf das erste Element statisch anlegen. Der müsste dann auch initialisiert sein bevor irgendwelcher Code ausgeführt wird:</p>
<pre><code class="language-cpp">// ...
char const* g_blubber = foo_&lt;sizeof(bar)&gt;::value;
</code></pre>
<p>Wenn man etwas mehr Aufwand treibt kann man auch ein Array erzeugen welches für eine N-Stellige Zahl genau N (nicht terminiert) oder N+1 (null-terminiert) chars gross ist, allerding war mir das nu wirklich zuviel Aufwand für schnell-mal-eben.</p>
<p>Vermutlich geht das auch alles eleganter, ist als &quot;proof of concept&quot; zu verstehen. (Wenn führende Nullen oder Spaces nicht stören geht's noch viel einfacher.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1339877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1339877</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Aug 2007 03:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Tue, 07 Aug 2007 11:48:59 GMT]]></title><description><![CDATA[<p>Hab ne andere templateisierte Version:</p>
<pre><code class="language-cpp">template&lt;unsigned int I&gt;
struct ToChars 
{
  enum {N =  (I&lt;10) ? 2 : ToChars&lt;I/10&gt;::N+1 }; //recursive
  static void fill(char* ptr)
  {
    if (I&gt;=10) ToChars&lt;I/10&gt;::fill(ptr);
    ptr[N-2] = ('0'+I%10); //angenommen '0'+1 = '1' etc. (*)
    ptr[N-1] = 0;
  }
};

template&lt;&gt; //to end the recursion
struct ToChars&lt;0&gt; {
  enum {N=2};
  static void fill(char* ptr) { ptr[0] = '0'; ptr[1] = 0; }
};

template &lt;typename T&gt;
struct SizeOfString {
  operator (const char*)() const { return data; }
  SizeOfString() { ToChars&lt;sizeof(T)&gt;::fill(data); }
private: 
  char data[ToChars&lt;sizeof(T)&gt;::N];
};
</code></pre>
<p>Die Main koennte dann so aussehen:</p>
<pre><code class="language-cpp">static SizeOfString&lt;int&gt; SizeOfIntString;
int main()
{
cout &lt;&lt; (const char*)SizeOfIntString &lt;&lt; endl;
}
</code></pre>
<p>Ich weiss dass der SizeOfString struct nicht optimal ist, die idee liegt aber eh im ToChars, um bereits zur compilezeit die laenge des noetigen char arrays zu kennen und dieses array auch fuellen zu koennen. Ich hab leider keine Moeglichkeiten gefunden, bereits zur Compilezeit Stringliterale zusammenzubauen, werd mich aber mit beschaeftigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1340105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1340105</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Aug 2007 11:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Tue, 07 Aug 2007 13:22:58 GMT]]></title><description><![CDATA[<p>der präprozessor ersetzt doch textuell, ich würde sagen, man könnte das schon machen, aber nur wenn man den Anführungszeichen auch ein #define gibt.</p>
<p>so etwa:</p>
<pre><code class="language-cpp">#define az &quot;  //Anführungszeichen
//[...]
const char meinArray[] = az sizeof(int) az;
</code></pre>
<p>ich habs aber nicht getestet, und es wäre ziemlich gepfuscht. Aber du könntest drauf hoffen, dass das der compiler herausoptimiert. Ich denke, das der schon in der Lage sein könnte das zu finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1340177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1340177</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Tue, 07 Aug 2007 13:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Tue, 07 Aug 2007 13:32:01 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>der präprozessor ersetzt doch textuell, ich würde sagen, man könnte das schon machen, aber nur wenn man den Anführungszeichen auch ein #define gibt.</p>
<p>so etwa:</p>
<pre><code class="language-cpp">#define az &quot;  //Anführungszeichen
//[...]
const char meinArray[] = az sizeof(int) az;
</code></pre>
</blockquote>
<p>das funktioniert leider nicht, weil der präprozessor ausgewertet wird, bevor der Compiler überhaupt die richtige parsearbeit übernimmt. Der Präprozessor ist also der allererste schritt.(um es genauer auszudrücken: zu dem zeitpunkt haben sachen wie &quot;sizeof&quot; oder &quot;int&quot; noch keine bedeutung)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1340184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1340184</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 07 Aug 2007 13:32:01 GMT</pubDate></item><item><title><![CDATA[Reply to (Visual) C++ Präprozessor -&amp;gt; String Operationen on Wed, 08 Aug 2007 06:28:17 GMT]]></title><description><![CDATA[<p>sprich: bei dir stünde dann im endeffekt:</p>
<pre><code class="language-cpp">const char meinArray[] = &quot; sizeof(int) &quot;;
</code></pre>
<p>Und das siezeof(int) würde nichtmehr ausgewertet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1340518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1340518</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 08 Aug 2007 06:28:17 GMT</pubDate></item></channel></rss>