<?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[Typsicheres count_of( array ) Makro]]></title><description><![CDATA[<p>Es wurde ja schon desöfteren darüber diskutiert, wie man die Größe eines Array zur Compilezeit herausfinden kann, dass dies aber bei Pointern falsche Werte liefert und dass man dies über ein Template abfangen könnte, das Ergebnis (vor constexpr in C++0x) dann aber nicht mehr compilezeit-konstant wäre.</p>
<p>Zur Erinnerung:</p>
<pre><code class="language-cpp">#define count_of( array ) (sizeof(array) / sizeof(*array)) // liefert bei Zeigern falsche Werte

template&lt; typename T, size_t N &gt; size_t count_of( T ( &amp;array )[N] ) { return N; } // nicht konstant

template&lt; typename T, size_t N &gt; constexpr size_t count_of( T ( &amp;array )[N] ) { return N; } // erst ab C++0x
</code></pre>
<p>Ich versuche gerade, das ganze irgendwie typsicher <strong>und</strong> konstant zu bekommen. Mein bisheriger Ansatz geht zwar IMHO in die richtige Richtung, der &quot;assertion helper&quot; verhindert aber noch, das ganze in constant expressions zu verwenden. Sieht jemand einen Weg, den ich bisher übersehe? Oder gibt es einfach keine Möglichkeit?</p>
<pre><code class="language-cpp">namespace detail {
        template&lt; typename T, size_t N &gt;
        void countof_assert( T ( &amp;array )[ N ] )
        {
        }
    } // namespace detail

#define countof( array ) ( detail::countof_assert( array ), sizeof( array ) / sizeof( *array ) )
// Bei Aufruf mit allem, was kein Array ist, wirft der Compiler eine &quot;no candidates for call to countof_assert( ... )&quot; Meldung
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/271811/typsicheres-count_of-array-makro</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 02:38:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271811.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Aug 2010 09:47:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 09:47:31 GMT]]></title><description><![CDATA[<p>Es wurde ja schon desöfteren darüber diskutiert, wie man die Größe eines Array zur Compilezeit herausfinden kann, dass dies aber bei Pointern falsche Werte liefert und dass man dies über ein Template abfangen könnte, das Ergebnis (vor constexpr in C++0x) dann aber nicht mehr compilezeit-konstant wäre.</p>
<p>Zur Erinnerung:</p>
<pre><code class="language-cpp">#define count_of( array ) (sizeof(array) / sizeof(*array)) // liefert bei Zeigern falsche Werte

template&lt; typename T, size_t N &gt; size_t count_of( T ( &amp;array )[N] ) { return N; } // nicht konstant

template&lt; typename T, size_t N &gt; constexpr size_t count_of( T ( &amp;array )[N] ) { return N; } // erst ab C++0x
</code></pre>
<p>Ich versuche gerade, das ganze irgendwie typsicher <strong>und</strong> konstant zu bekommen. Mein bisheriger Ansatz geht zwar IMHO in die richtige Richtung, der &quot;assertion helper&quot; verhindert aber noch, das ganze in constant expressions zu verwenden. Sieht jemand einen Weg, den ich bisher übersehe? Oder gibt es einfach keine Möglichkeit?</p>
<pre><code class="language-cpp">namespace detail {
        template&lt; typename T, size_t N &gt;
        void countof_assert( T ( &amp;array )[ N ] )
        {
        }
    } // namespace detail

#define countof( array ) ( detail::countof_assert( array ), sizeof( array ) / sizeof( *array ) )
// Bei Aufruf mit allem, was kein Array ist, wirft der Compiler eine &quot;no candidates for call to countof_assert( ... )&quot; Meldung
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1935999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935999</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 04 Aug 2010 09:47:31 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 09:59:03 GMT]]></title><description><![CDATA[<p>für genau die Problematik wurde std::tr1::array geschaffen (oder boost::array)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936004</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 04 Aug 2010 09:59:03 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 10:03:51 GMT]]></title><description><![CDATA[<p>Manchmal bekommt man aber nunmal ein nacktes Array einfach so vorgesetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936006</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 04 Aug 2010 10:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 10:20:00 GMT]]></title><description><![CDATA[<p>(ungetestet)</p>
<pre><code class="language-cpp">namespace detail
{
	template&lt;bool b, std::size_t size&gt;
	struct count_of_impl;

	template&lt;std::size_t size&gt;
	struct count_of_impl&lt;true, size&gt;
	{
		static const std::size_t value = size;
	}
}

#define count_of(array) detail::count_of_impl&lt;boost::is_array&lt;BOOST_TYPEOF(array)&gt;::value, sizeof(array)/sizeof(*array)&gt;::value
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1936013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936013</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Wed, 04 Aug 2010 10:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 10:17:40 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">namespace detail {
        template&lt; typename T, size_t N &gt;
        int countof_assert( T ( &amp;array )[ N ] );
    } // namespace detail

#define countof( array ) ( (void)sizeof(detail::countof_assert( array )), sizeof( array ) / sizeof( *array ) )
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1936014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936014</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 04 Aug 2010 10:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 10:17:51 GMT]]></title><description><![CDATA[<p>Probiers mal so:</p>
<pre><code class="language-cpp">namespace detail {
        template&lt; typename T, size_t N &gt;
        T (&amp;countof_assert(T(&amp;array)[N]))[N]
        {
            return array;
        }
    } // namespace detail

#define countof(array) ( sizeof(detail::countof_assert(array)) / sizeof(*array))
</code></pre>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1936015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936015</guid><dc:creator><![CDATA[jokester]]></dc:creator><pubDate>Wed, 04 Aug 2010 10:17:51 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 10:26:27 GMT]]></title><description><![CDATA[<p>jokester schrieb:</p>
<blockquote>
<p>Probiers mal so:</p>
<pre><code class="language-cpp">namespace detail {
        template&lt; typename T, size_t N &gt;
        T (&amp;countof_assert(T(&amp;array)[N]))[N];
        {
            return array;
        }
    } // namespace detail

#define countof(array) ( sizeof(detail::countof_assert(array)) / sizeof(*array))
</code></pre>
<p><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>
</blockquote>
<pre><code class="language-cpp">namespace detail {
        template&lt; typename T, size_t N &gt;
        char (&amp;countof_assert(T(&amp;array)[N]))[N];
    } // namespace detail

#define countof(array) ( sizeof(detail::countof_assert(array)))
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1936018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936018</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 04 Aug 2010 10:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 10:27:27 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Manchmal bekommt man aber nunmal ein nacktes Array einfach so vorgesetzt.</p>
</blockquote>
<p>Dann kriegt man es entweder als Pointer + Größenangabe geliefert, so dass die Größe zur Compilezeit nicht zu ermitteln ist.</p>
<p>Wie auch immer, folgendes ließ sich zumindest auf codepad und MSVC compilieren und liefert das richtige ergebnis:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct count_array;

template &lt;class T, size_t N&gt;
struct count_array&lt;T [N]&gt;
{
  char c[N];
};

template &lt;class T&gt;
count_array&lt;T&gt; count_(T&amp;);

#define count_of(X) sizeof(count_(X))
</code></pre>
<p>Gilt allerdings nur, wenn sizeof beim struct == sizeof char[n]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936020</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 04 Aug 2010 10:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 10:44:06 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Dann kriegt man es entweder als Pointer + Größenangabe geliefert, so dass die Größe zur Compilezeit nicht zu ermitteln ist.</p>
</blockquote>
<p>Immer diese Grundsatzdiskussionen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Also gut, im konkreten Fall haben wir viele Strukturen, die COBOL-Datenfelder abbilden. Diese enthalten nur Char-Arrays, Arrays von Char-Arrays oder Arrays von Strukturen, die selbiges enthalten. Da kommt der Bedarf halt ab und zu mal hoch.</p>
<p>Ansonsten danke für die Lösungen, der sizeof-Trick ist genial <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1936029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936029</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 04 Aug 2010 10:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 11:11:28 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">namespace detail {
        template&lt; typename T, size_t N &gt;
        char (&amp;countof_assert(T(&amp;array)[N]))[N];
    } // namespace detail

#define countof(array) ( sizeof(detail::countof_assert(array)))
</code></pre>
</blockquote>
<p>me like it <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936041</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Aug 2010 11:11:28 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 12:02:20 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ansonsten danke für die Lösungen, der sizeof-Trick ist genial <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>
</blockquote>
<p><code>sizeof</code> ist sowieso genial. Man kann damit die verrücktesten Dinge tun, zum Beispiel Vererbungshierarchien zur Kompilierzeit zu erkennen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936060</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 04 Aug 2010 12:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Wed, 04 Aug 2010 19:09:59 GMT]]></title><description><![CDATA[<p>Jo, allgemein finde ich den Trick <code>sizeof(OverloadedFunction(something))</code> ziemlich cool.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936281</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Aug 2010 19:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Fri, 06 Aug 2010 13:49:17 GMT]]></title><description><![CDATA[<p>Jetzt fällt mir endlich wieder ein wo es beim Template-Trick hakt: der erfordert dass T ein Typ mit &quot;external linkage&quot; ist.<br />
Also sowas geht damit z.B. nicht:</p>
<pre><code class="language-cpp">void foo()
{
    struct bar { ... };
    bar b[123];
    countof(b); // bar hat keine &quot;external linkage&quot; -&gt; fehler
}
</code></pre>
<p>Was auch der Grund ist warum ich das in unserer Basis-Library jetzt doch nicht umgeschrieben habe <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/1937120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937120</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 06 Aug 2010 13:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Typsicheres count_of( array ) Makro on Tue, 10 Aug 2010 04:59:28 GMT]]></title><description><![CDATA[<p>Das kommt in unserem Anwendungsfall zum Glück nicht vor...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938123</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 10 Aug 2010 04:59:28 GMT</pubDate></item></channel></rss>