variable - function pointer c




Funktionszeigertyp zurückgeben (5)

Dies ist ein dummes Beispiel, aber es ist einfach und es gibt keine Fehler. Es geht nur darum, statische Funktionen zu deklarieren:

#include <stdio.h>
#include <stdlib.h>

void * asdf(int);
static int * hjkl(char,float);

main() {
  int a = 0;
  asdf(a);
 }


void * asdf(int a) {return (void *)hjkl; }
static int * hjkl(char a, float b) {int * c; return c;}

Oft finde ich die Notwendigkeit, Funktionen zu schreiben, die Funktionszeiger zurückgeben. Wann immer ich das mache, ist das grundlegende Format, das ich verwende:

typedef int (*function_type)(int,int);

function_type getFunc()
{
   function_type test;
   test /* = ...*/;
   return test;
}

Dies kann jedoch bei einer großen Anzahl von Funktionen umständlich werden, so dass ich nicht für jede einzelne (oder für jede Klasse von Funktionen) ein Typedef deklarieren muss.

Ich kann das typedef entfernen und die in der Funktion zurückgegebene lokale Variable folgendermaßen definieren: int (*test)(int a, int b); den Funktionskörper so aussehen lassen:

{
     int (*test)(int a, int b);
     test /* = ...*/;
     return test;
}

Ich weiß dann nicht, was ich für den Rückgabetyp der Funktion einstellen soll. Ich habe versucht:

int(*)(int,int) getFunc()
{
    int (*test)(int a, int b);
    test /* = ...*/;
    return test;
}

aber das meldet einen Syntaxfehler. Wie deklariere ich den Rückgabetyp für eine solche Funktion, ohne einen Typedef für den Funktionszeiger zu deklarieren? Ist es überhaupt möglich? Beachten Sie auch, dass mir bewusst ist, dass es anscheinend sauberer wäre, Typedefs zu deklarieren. Für jede der Funktionen bin ich jedoch sehr darauf bedacht, meinen Code so zu strukturieren, dass er so sauber und einfach wie möglich ist. Der Grund, weshalb ich die Typedefs entfernen möchte, ist, dass sie häufig nur zur Deklaration der Retrieval-Funktionen verwendet werden und daher im Code überflüssig erscheinen.


Ich denke, du hast drei Möglichkeiten:

  1. Bleib bei Typedef. Am Ende des Tages ist es die Aufgabe von Typedef.
  2. Geben Sie void * und das Casting zurück.
  3. Überdenken Sie Ihre Softwarearchitektur. Vielleicht können Sie uns mitteilen, was Sie erreichen wollen und ob wir Sie in eine bessere Richtung weisen können.

Sie können den folgenden Code schreiben (funktioniert nur in C ++ 11 und höher):

//C++11
auto func(...) {
    int (*fptr)(...) ret = ...
    //Do sth.
    return ret;//C++11 compiler will automatically deduce the return type for you
}

Wenn Sie den automatischen Abzugstyp nicht mögen, können Sie den Typ am Ende der Funktion angeben (wie oben, nur in C ++ 11 und höher):

//C++11
auto func(...) -> int (*)(...) { /* Do sth. */ }

Sie können wahrscheinlich so etwas tun:

int foo (char i) {return i*2;}

int (*return_foo()) (char c)
{
   return foo;
}

aber Gott, ich hoffe, ich werde nie Code debuggen müssen ....


int (*getFunc())(int, int) {  }

Dies liefert die von Ihnen angeforderte Erklärung. Darüber hinaus wäre es gut, wie ola1olsson bemerkt, ola1olsson einzufügen:

int (*getFunc(void))(int, int) {  }

Dies besagt, dass getFunc möglicherweise keine Parameter verwendet, wodurch Fehler getFunc können, z. B. wenn jemand versehentlich getFunc(x, y) anstelle von getFunc()(x, y) .







function-pointers