2010-12-07 18 views
3

Können Sie bitte erklären, was die folgende Zeile bedeutet?C++ typedef Erklärung

typedef int (*Callback)(void * const param,int s) 

Antwort

6

Es bedeutet, dass Callback ein neuer Name für die Art ist: Zeiger auf eine Funktion, um ein zurückkehr int und zwei Parameter des Typs ‚const Zeiger auf void‘ und ‚int‘ nehmen.

int f(void * const param, int s) 
{ 
    /* ... */ 
} 

Die Callback kann verwendet werden, zu speichern, einen Zeiger auf f:

Callback c = &f; 

f kann, ohne direkt Bezug über den Zeiger später aufgerufen werden Die Funktion seiner

eine Funktion f Gegeben Name:

int result = c(NULL, 0); 

Zum Zeitpunkt des Anrufs wird der Name f nicht angezeigt.

+0

und wie kann ich diese Funktion implementieren? – gln

+1

@gln: es ist ein Zeiger auf Funktion, es bedeutete in der Regel zu einer vorhandenen Funktion, die die Signatur entspricht – icecrime

+0

Was meinst du? –

2

Es schafft einen neuen „alias“ oder Namen, mit dem Sie Zeiger auf Funktionen beziehen, die int und nehmen zwei Parameter zurück: ein void* const und ein int. Anschließend können Sie Variablen dieses Typs erstellen, zu ihnen zuweisen, rufen Sie die Funktion durch sie usw., wie in:

int fn(void * const param,int s) { ... } 

Callback p; 
p = fn; 
int x = p(NULL, 38); 

Beachten Sie, dass typedef s nicht wirklich neue Typen erstellen ... jedes Äquivalent typedef dem Einzel aufgelöst realer Typ für die Zwecke der Überladungsauflösung, Vorlage Instanziierung etc ..

+0

Ich mag den Begriff Alias ​​hier. Ich wünschte, typedef hätte eigentlich Typalias genannt (mit typedef, das neue Typen erzeugt). –

+0

@Martin: das wäre wirklich gut - habe 'Vorlage Klasse Wrapper {...};' erstellen und 'N' oft manuell variieren, um neue 'T's zu simulieren. Abgerundet wird dies dadurch, dass Features, die von einem "neuen Typ" zurück zum eigentlichen zugrunde liegenden Typ mappen, dem Programmierer die Möglichkeit geben, separate Template-Instanziierungen oder eine gemeinsame Template-Instanz anzugeben, und ob die Typen äquivalent sein sollten für passende Function Call-Parameter - aber das ist ein bisschen mehr Komplexität! –

2

Es deklariert eine Funktion Typen:

// Set up Callback as a type that represents a function pointer 
typedef int (*Callback)(void * const param,int s); 

// A function that matches the Callback type 
int myFunction(void* const param,int s) 
{ 
    // STUFF 
    return 1; 
} 

int main() 
{ 
    // declare a variable and assign to it. 
    Callback funcPtr = &myFunction; 
}