2016-10-21 7 views
1

Ich versuche, eine Funktion zu schreiben, die einen Funktionszeiger zurückgibt, ohne irgendwelche typedefs zu verwenden. Die zurückgegebene Funktion muss zuweisbar sein:Einen Funktionszeiger ohne typedef zurückgeben

Ist dies der beste/einzige Weg, es zu tun?

Es gibt zwei Statiken, weil ich möchte, dass die Assigner-Funktion auch statisch ist.

+0

Funktioniert das? Probieren Sie es aus und sagen Sie uns .. –

+0

@EugeneSh. Entschuldigung :) was ich meinte war, ist das die richtige/idiomatische Art das zu tun? –

+2

Warum nicht ein 'typedef' verwenden? Wenn es ein Teil einer Schnittstelle ist, wäre der richtige Weg, es zu verwenden. –

Antwort

3

Das erste Problem mit Ihrer Definition ist, dass es null Sinn macht, static static zu schreiben. Dies liegt daran, dass static ein Speicherqualifikationsmerkmal ist und es nicht Teil des Typs an sich ist. Das zweite Problem besteht darin, dass Sie für beide Funktionen eine Parameterliste benötigen.

Sie können schreiben:

int (*compare_function(void))(int a) { 
    ... 
} 

Oder Sie können compare_function statisch machen:

static int (*compare_function(void))(int a) { 
    ... 
} 

Jede dieser ein Objekt vom Typ int (*)(int a) kehrt das ist, was Sie wollen. Um zu klären, ohne typedef zu verwenden, ist dies der einzige Weg, eine Funktion zu schreiben, die eine Funktion gibt (ohne Someo

Schreiben static static keinen Sinn macht, Stellen Sie sich vor etwas wie das Schreiben.

// no 
typedef static int SInt; 

Das ist nur doesn‘ t macht keinen Sinn entweder, so, wenn Sie eine Variable.

static int (*compare_function)(int a); 

der Typ ist int (*)(int) und die Speicherdauer ist statisch, und die Verbindung ist die interne

+1

Sie haben recht, aber Sie scheinen den Punkt der Frage zu übersehen, wie Sie eine Signatur für eine Funktion schreiben, deren Rückgabetyp der Funktionszeigertyp ist. –

+0

@JohnBollinger: "Kannst du schreiben? Int (* compare_function) (int a)' "deckt das nicht ab? Ich bin verwirrt, warum du denkst, dass das die Frage nicht beantwortet. –

+0

Korrigieren Sie mich, wenn ich falsch liege @DietrichEpp - aber Sie bestätigen im Wesentlichen, dass seine erste Codezeile vielleicht der "beste" oder "idiomatische" Weg ist, einen Funktionszeiger mit einem 'typedef' zurückzugeben? –

1

Hier ist die Art und Weise richtig Funktionszeiger zurück:

int compare_function(int a); 

int (*assign_compare_function())(int) 
{ 
    return compare_function; 
} 
0

Das Schlüsselwort static ist eine Bereichsqualifizierer. Es ist nicht Teil des Typs selbst.

int (*compare_function)(int a); 

Dies gibt die Funktion an, die int 'a' returning int. Sie können die Funktion compare_function nach dieser Anweisung verwenden, um einen Typ auf diese Funktionssignatur zu verweisen.

Man könnte es zuweisen:

static int my_compare_function(int a) 
{ 
    return a - 10; // stupid implementation 
} 

compare_function = my_compare_function; 

Beachten Sie, dass my_compare_function die statische Qualifier hat.

Verwandte Themen