2016-11-25 7 views
-2

Ich versuche zu erklären, ein Verfahren typedef zu erklären, die einen Zeiger Parameter der Methode Typ selbst umfasst - ist das möglich?Wie ein Verfahren Zeiger als typedef Methodenparameter

Verfahren würde in etwa so aussehen:

void myFunc(FuncType* pFunc, int a) {} 

wo myFunc eine Erklärung, die FuncType einstimmt, so konnte ich eine Variable und rufen Sie es wie folgt festgelegt:

FuncType f = myFunc; 
f(&f, 5); 

Ich habe versucht, Deklarieren eines typedef, der dieser Methode entspricht:

typedef void (*FuncType)(FuncType*, int); 

Dies funktioniert jedoch nicht, da FuncType erforderlich ist, bevor es vollständig deklariert ist. Ich kann das beheben, indem ich den Parameter auf einen void-Zeiger setze, aber es gibt einen Weg herum; vielleicht durch irgendeine Form der Vorwärtsdeklaration von FuncType?

Antwort

1

Das ist unmöglich ; Eine Funktion kann keinen Parameter eines eigenen Typs annehmen (oder eine solche zurückgeben).
Dies ist der Fall für alle einigermaßen leistungsfähige Systeme des Typs.

Die einzige Lösung ist eine Indirektion durch eine andere Art einzuführen, wie Sie mit void* tat.

Es ist analog wie eine Klasse nicht eine Instanz von sich selbst als Mitglied enthalten, die Sie durch indirecting durch einen Zeiger oder eine Referenz umgehen.

+0

Ja, das dachte ich mir. Ich dachte, indem ich den Parameter als Zeiger auf den Typ deklariere, könnte ich damit genauso durchkommen wie structs und classes. Offensichtlich nicht. – adelphus

0

Sie können nicht nur NICHT so eine typedef deklarieren, Sie können eine solche Funktion auch nicht deklarieren. Dies führt zu einer unendlichen Rekursion.

Hier ist, wie eine solche Funktion Erklärung würde wie folgt aussehen:

void myFunc(void (*pFunc)(...), int a); 

wo ... würde erweitern:

void (*pFunc)(...), int) 

wo ... erweitern würde:

void (*pFunc)(...), int) 
+0

Wo ist die Rekursion? Ich mache nur eine Funktion und übergebe einen Zeiger und eine Ganzzahl. – adelphus

+0

@adelphus Die „Rekursion“ auf Typebene ist, nicht in der Funktion selbst. – molbdnilo

+0

OK, ich verstehe es. Der Grund, warum ich nicht zustimme, ist, dass der Parameter ein ** -Zeiger ** für den Typ ist, nicht der Typ selbst. So können Sie Strukturen und Klassen so deklarieren, dass sie ein Mitglied von sich selbst enthalten - Sie deklarieren einen Zeiger auf die Struktur oder Klasse und das Typsystem verwaltet es, um es zu sortieren. – adelphus