<?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[Wie funktioniert Typedef?]]></title><description><![CDATA[<p>Ich verstehe typedef nicht!</p>
<pre><code class="language-cpp">typedef int muh
muh var1;
</code></pre>
<p>Ist noch klar, denn das verstehe ich einfach als Ersetzung. Sobald es aber an Zeiger oder gar Funktionszeiger geht, sieht alles Banane aus. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Hier ein paar Beispiele:</p>
<pre><code class="language-cpp">string *const cstr;

typedef string *pstring;
const pstring cstr2;
</code></pre>
<p>Wäre es nur eine Ersetzung, wäre cstr2 ein Zeiger auf const. Tatsächlich ist es aber ein konstanter Zeiger wie in Zeile 1 definiert ist. Warum ist das so?</p>
<pre><code class="language-cpp">// Funktionsdeklaration ff(int), Rückgabetyp ist ein Funktionszeiger auf int (*)(int *, int)
int (*ff(int))(int*, int);

// Ersatz mit typedef
typedef int (*PF) (int*, int);
PF ff(int);
</code></pre>
<p>Der Typedef macht das eigentlich recht verständlich, verwirrend ist aber, dass die Deklartion eigentlich die oben genannte Form haben muss und es deshalb nicht wie der Typedef es für mich darstellt &quot;int (*PF) (int*, int) ff(int);&quot; heißt.</p>
<p>Wie kann man das korrekt lesen? Warum und wie ergeben sich diese Zusammenhänge?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201974/wie-funktioniert-typedef</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 15:45:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201974.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Jan 2008 10:59:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Sun, 06 Jan 2008 10:59:24 GMT]]></title><description><![CDATA[<p>Ich verstehe typedef nicht!</p>
<pre><code class="language-cpp">typedef int muh
muh var1;
</code></pre>
<p>Ist noch klar, denn das verstehe ich einfach als Ersetzung. Sobald es aber an Zeiger oder gar Funktionszeiger geht, sieht alles Banane aus. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Hier ein paar Beispiele:</p>
<pre><code class="language-cpp">string *const cstr;

typedef string *pstring;
const pstring cstr2;
</code></pre>
<p>Wäre es nur eine Ersetzung, wäre cstr2 ein Zeiger auf const. Tatsächlich ist es aber ein konstanter Zeiger wie in Zeile 1 definiert ist. Warum ist das so?</p>
<pre><code class="language-cpp">// Funktionsdeklaration ff(int), Rückgabetyp ist ein Funktionszeiger auf int (*)(int *, int)
int (*ff(int))(int*, int);

// Ersatz mit typedef
typedef int (*PF) (int*, int);
PF ff(int);
</code></pre>
<p>Der Typedef macht das eigentlich recht verständlich, verwirrend ist aber, dass die Deklartion eigentlich die oben genannte Form haben muss und es deshalb nicht wie der Typedef es für mich darstellt &quot;int (*PF) (int*, int) ff(int);&quot; heißt.</p>
<p>Wie kann man das korrekt lesen? Warum und wie ergeben sich diese Zusammenhänge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1431677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1431677</guid><dc:creator><![CDATA[Typo3]]></dc:creator><pubDate>Sun, 06 Jan 2008 10:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Sun, 06 Jan 2008 11:38:57 GMT]]></title><description><![CDATA[<p>Typo3 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">string *const cstr;

typedef string *pstring;
const pstring cstr2;
</code></pre>
<p>Wäre es nur eine Ersetzung, wäre cstr2 ein Zeiger auf const. Tatsächlich ist es aber ein konstanter Zeiger wie in Zeile 1 definiert ist. Warum ist das so?</p>
</blockquote>
<p>pstring ist ein typedef auf den Typ 'Zeiger auf string', also ist const pstring der Typ 'konstanter Zeiger auf string'.</p>
<blockquote>
<pre><code class="language-cpp">// Funktionsdeklaration ff(int), Rückgabetyp ist ein Funktionszeiger auf int (*)(int *, int)
int (*ff(int))(int*, int);

// Ersatz mit typedef
typedef int (*PF) (int*, int);
PF ff(int);
</code></pre>
<p>Der Typedef macht das eigentlich recht verständlich, verwirrend ist aber, dass die Deklartion eigentlich die oben genannte Form haben muss und es deshalb nicht wie der Typedef es für mich darstellt &quot;int (*PF) (int*, int) ff(int);&quot; heißt.</p>
</blockquote>
<p>Im Grunde sind typedefs ganz einfach zu lesen: Sie sehen genauso aus wie andere Deklarationen, nur dass da noch typedef davorsteht. Das zu deklarierende wird dadurch statt zu einer Variable oder Funktion zu einem Typ. Und Deklarationen liest man so:</p>
<p>1. Trennung in Typ und Deklarator<br />
Beispiele:<br />
int x; Typ int, Deklarator x, Aussage: x hat den Typ int<br />
int* x; Typ: int, Deklarator *x, Aussage: *x hat den Typ int<br />
int f(); Typ: int, Deklarator: f(), Aussage: f() hat den Typ int</p>
<p>2. Aus dem Typ des Deklarators folgern, welchen Typ das deklarierte Objekt hat</p>
<p>Beispiele:<br />
int x; =&gt; x hat den Typ int<br />
int* x; =&gt; Wenn ich x dereferenziere, bekomme ich x, also hat x den Typ Zeiger auf int<br />
int f(); =&gt; Wenn ich f mit () aufrufe, ergibt sich int, also ist f eine Funktion mit der Argumentliste (), die int zurückliefert</p>
<pre><code class="language-cpp">typedef int (*PF)(int*, int);
</code></pre>
<p>(*PF)(int*, int) ist der Deklarator, das soll int ergeben.<br />
Folgerungen:<br />
(*PF) ist eine Funktion mit der Argumentliste (*int, int)<br />
PF ist ein Zeiger</p>
<p>Zusammen: PF ist ein Zeiger auf eine Funktion mit der Argumentliste (*int, int), die int zurückliefert.</p>
<pre><code class="language-cpp">int (*ff(int))(int*, int);
</code></pre>
<p>(*ff(int))(int*,int) soll int sein<br />
Folgerungen:<br />
(*ff(int)) ist eine Funktion mit der Argumentliste (int*,int)<br />
ff(int) ist ein Zeiger<br />
ff ist eine Funktion mit der Argumentliste (int)</p>
<p>Zusammen: ff ist eine Funktion mit (int), die einen Zeiger zurückliefert auf eine Funktion mit der Argumentliste (int*,int), die int zurückliefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1431698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1431698</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 06 Jan 2008 11:38:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Sun, 06 Jan 2008 12:08:56 GMT]]></title><description><![CDATA[<p>Typo3 schrieb:</p>
<blockquote>
<p>...Warum ist das so?...</p>
</blockquote>
<p>Weil ein typedef eben nicht dasselbe ist wie ein #define.<br />
Es &quot;bindet stärker&quot; als ein const....</p>
<p>Ist übrigens ein Grund, warum ich immer dringend von &quot;Pointer-typedefs&quot; abrate (auch, wenn sie nicht ganz so gräßlich sind wie &quot;#define-typedefs&quot;): Sie verhalten sich nicht immer so, wie erwartet.</p>
<pre><code class="language-cpp">typedef string STRING1;
typedef char* STRING2;

void f(const STRING1);
void f(const STRING2);
</code></pre>
<p>.. die beiden f haben unterschiedliche Parametersemantik !</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1431715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1431715</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 06 Jan 2008 12:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Sun, 06 Jan 2008 16:37:01 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Ist übrigens ein Grund, warum ich immer dringend von &quot;Pointer-typedefs&quot; abrate</p>
</blockquote>
<p>Mal davon abgesehen, dass ich den Nachteil nicht verstehe (das ist doch vielmehr das intuitive Verhalten): Was bietest Du als Alternative?</p>
<p>Ich benötige die Zeiger-Typedefs einfach, weil ich den Zeiger-Typ austauschbar halten muss. Daher habe ich Folgendes in einem Code:</p>
<pre><code class="language-cpp">// config.hpp, allgemeine Konfiguration des Projekts:

// Diese Definition kann sich ändern!
template &lt;typename T&gt;
struct ptr {
    typedef boost::shared_ptr&lt;T&gt; type;
};
</code></pre>
<pre><code class="language-cpp">// fwd.hpp, enthält einige Vorwärtsdeklarationen:

#include &quot;config.hpp&quot;

struct expression;
struct reference;
struct value;
// …

#define EXPR_PTR_ALIAS(name) typedef ptr&lt;name&gt;::type p_##name;

EXPR_PTR_ALIAS(expression)
EXPR_PTR_ALIAS(reference)
EXPR_PTR_ALIAS(value)

#undef EXPR_ALIAS_PTR
</code></pre>
<p>… wie könnte ich das besser machen? Überall die ausführliche Schreibweise <code>ptr&lt;xyz&gt;::type</code> zu verwenden, bläht den Code unheimlich auf und macht ihn extrem unleserlich (ich habe es versucht – es war einfach furchtbar).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1431919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1431919</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 06 Jan 2008 16:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Sun, 06 Jan 2008 20:10:23 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5021">@Konrad</a></p>
<p>Sehe ich auch so, was wuerde man in der generischen Programmierung unter C++ ohne typedefs machen?!</p>
<p>Edit: Simon2 redet aber auch nur von &quot;Pointer-Typedefs&quot;. Und ein shared_ptr&lt;irgendwas&gt; ist kein Pointer, genauso wie ein std::vector kein array ist.</p>
<p>Edit2: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a> Ich komm mit deiner Aussage ueber &quot;Pointer-Typedefs&quot; nicht ganz klar. Kannst du das bitte mal fuer mich praezisieren bzw. mal ein konkretes Codebeispiel geben, bei denen die beiden typedefs zu Problemen fuehren. Danke <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/1432075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432075</guid><dc:creator><![CDATA[Kohma]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:10:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Sun, 06 Jan 2008 20:21:38 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Ist übrigens ein Grund, warum ich immer dringend von &quot;Pointer-typedefs&quot; abrate (auch, wenn sie nicht ganz so gräßlich sind wie &quot;#define-typedefs&quot;): Sie verhalten sich nicht immer so, wie erwartet.</p>
<pre><code class="language-cpp">typedef char* STRING2;
</code></pre>
</blockquote>
<p>Ich glaube das Problem hier ist, dass du durch einen Typedef die speziellen Eigenschaften eines char-Pointers für den Leser unsichtbar werden lässt, so dass er mit falschen Erwartungen an diesen Typ herangeht. Mit typedefs auf Pointer hat das an sich nichts zu tun, nur mit sinnvoller Namensgebung.</p>
<p>Davon abgesehen ist es natürlich oft ein Rückschlag in längst vergangene Pascal-Tage, zwanghaft typedefs auf Pointer einzuführen. Man sieht das zum Glück immer seltener.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432089</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Sun, 06 Jan 2008 20:26:43 GMT]]></title><description><![CDATA[<p>Gut, das sehe ich auch so mit der sinnvollen Namensgebung. BTW ich finde deine Signatur toll Bashar <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/1432091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432091</guid><dc:creator><![CDATA[Kohma]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:26:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Mon, 07 Jan 2008 07:27:22 GMT]]></title><description><![CDATA[<p>um die scheinbare Ungereimtheit mit den Pointertypedefs und anschließender const-Deklaration zu vermeiden, kann man es sich angewöhnen, const grundsätzlich <em>nach</em> dem als const zu deklarierenden Typen zu schreiben, also statt</p>
<pre><code class="language-cpp">const int i;
</code></pre>
<p>dann</p>
<pre><code class="language-cpp">int const;
</code></pre>
<p>. Dann wird aus typedefs nämlich</p>
<pre><code class="language-cpp">typedef int* Iptr;
Iptr const iptr; //klar, das ist int* const, also ein constanter Zeiger auf int
</code></pre>
<p>Zugegeben, ich habs bisher erst in einem Buch gesehn, dass das auch umgesetzt wurde (Josuttis/Vandervoorde, &quot;C++ Templates, a complete guide&quot;), aber es öst eben das Problem. Ob es sinnvoll ist, das umzusetzen, sei jedem selbst überlassen, allerdings empfinde ich persönlich Dinge wie</p>
<pre><code class="language-cpp">foo foo::operator=(foo const&amp; other); //seltsame Art, eine const reference zu deklarieren)
</code></pre>
<p>als die größere Stolperfalle beim Lesen im Vergleich zu den doch eher selten vorkommenden Pointer typedefs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432211</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 07 Jan 2008 07:27:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Mon, 07 Jan 2008 08:47:11 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>...<br />
Ich glaube das Problem hier ist, dass du durch einen Typedef die speziellen Eigenschaften eines char-Pointers für den Leser unsichtbar werden lässt, so dass er mit falschen Erwartungen an diesen Typ herangeht. ...</p>
</blockquote>
<p>Genau DAS meinte ich: Das &quot;Verstecken&quot; der Pointersemnatik des Typs.<br />
Passiert natürlich viel bei char*, ich habe es aber auch schon öfter bei anderen Typen gesehen (2. Rang: void, gibt aber noch mehr).</p>
<p>Und das (also das Verstecken) finde ich fatal.</p>
<p>Wenn aus dem Typ(namen) noch klar hervorgeht, dass er als Zeiger zu handeln ist, finde ich das voll OK. (z.B bei Funktionspointern erhöht IMHO oftmals die Lesbarkeit, ohne eine andere Semantik zu suggerieren).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432231</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 07 Jan 2008 08:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Mon, 07 Jan 2008 10:32:52 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Ob es sinnvoll ist, das umzusetzen, sei jedem selbst überlassen, allerdings empfinde ich persönlich Dinge wie</p>
<pre><code class="language-cpp">foo foo::operator=(foo const&amp; other); //seltsame Art, eine const reference zu deklarieren)
</code></pre>
<p>als die größere Stolperfalle beim Lesen im Vergleich zu den doch eher selten vorkommenden Pointer typedefs.</p>
</blockquote>
<p>Stolperfalle? Ich mache das immer so. Und zwar aus dem ganz einfachen Grund, dass ich es einheitlicher finde, 'const' stets postfix anzugeben, denn bei Funktionsdeklarationen steht 'const' ja auch postfix, und wenn man da mischt, sieht das komisch aus:</p>
<pre><code class="language-cpp">void f(const t&amp;) const;
// versus
void g(t const&amp;) const;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1432268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432268</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 07 Jan 2008 10:32:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Mon, 07 Jan 2008 17:29:18 GMT]]></title><description><![CDATA[<p>Wie gut, daß C bzw. C++ beides erlaubt (const als Prä- und Postfix).<br />
So kann es jeder machen, wie er will und man kann sich schön über den &quot;unleserlichen&quot; Code von anderen aufregen <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>P.S. Ich persönlich nutze 'const' als Präfix, quasi als einleitendes Schlüsselwort.<br />
So daß ein konstanter Zeiger auf ein konstantes Objekt dann quasi symmetrisch ist:</p>
<pre><code class="language-cpp">const A * const pA; // Edit: * entfernt (wollte nur einen Einfach-Zeiger darstellen)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1432310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432310</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 07 Jan 2008 17:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Mon, 07 Jan 2008 12:46:40 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<pre><code class="language-cpp">const A * const * a;
</code></pre>
</blockquote>
<p>Was dann ein non-const-Zeiger auf einen const-Zeiger auf ein const-Objekt waere <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 />
Ist denke ich mal Geschmackssache, wie man es nun macht. Man wird sich dran gewoehnen muessen, dass man es mal als Prae- und mal als Postfix zu lesen bekommt, wenn man sich fremden Code anschaut. Fuer sich selber sollte man es auf jeden Fall konsistent halten, wenn man mit mehreren an einem groesseren Projekt arbeitet moeglichst projektweit einheitlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432363</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 07 Jan 2008 12:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wie funktioniert Typedef? on Mon, 07 Jan 2008 13:57:46 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Wie gut, daß C bzw. C++ beides erlaubt (const als Prä- und Postfix)...</p>
</blockquote>
<p>Naja ... aber nur auf den ersten Qualifizierer. Ansonsten ist es ja immer postfix...</p>
<p>Vielleicht wäre es schon, es IMMER als Präfix zu haben, da es aber nunmal so ist, wie es ist, präferiere ich da auch ein einheitliches Postfix.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432423</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 07 Jan 2008 13:57:46 GMT</pubDate></item></channel></rss>