funktionpointer - funktionspointer c++




Typedef Funktionszeiger? (4)

  1. typedef wird verwendet, um Typen zu typedef ; In diesem Fall aliasieren Sie FunctionFunc in void(*)() .

  2. Tatsächlich sieht die Syntax seltsam aus, sieh dir das an:

    typedef   void      (*FunctionFunc)  ( );
    //         ^                ^         ^
    //     return type      type name  arguments
    
  3. Nein, das erklärt einfach, dass der FunctionFunc Typ ein Funktionszeiger ist, er definiert keinen, wie folgt:

    FunctionFunc x;
    void doSomething() { printf("Hello there\n"); }
    x = &doSomething;
    
    x(); //prints "Hello there"
    

Ich lerne, DLLs dynamisch zu laden, aber was ich nicht verstehe, ist diese Linie

typedef void (*FunctionFunc)();

Ich habe ein paar Fragen. Wenn jemand in der Lage ist, sie zu beantworten, wäre ich dankbar.

  1. Warum wird typedef verwendet?
  2. Die Syntax sieht seltsam aus; nach void sollte es keinen Funktionsnamen oder etwas geben? Es sieht wie eine anonyme Funktion aus.
  3. Wird ein Funktionszeiger erstellt, um die Speicheradresse einer Funktion zu speichern?

Ich bin im Moment verwirrt. Kannst du Dinge für mich klären?


Ohne das typedef Wort deklariert die Deklaration in C ++ eine Variable FunctionFunc vom Typ Zeiger auf die Funktion keine Argumente und gibt void .

Mit dem typedef definiert es stattdessen FunctionFunc als einen Namen für diesen Typ.


typedef ist ein Sprachkonstrukt, das einem Typ einen Namen typedef .
Sie verwenden es zum Beispiel genauso wie den Originaltyp

  typedef int myinteger;
  typedef char *mystring;
  typedef void (*myfunc)();

mit ihnen wie

  myinteger i;   // is equivalent to    int i;
  mystring s;    // is the same as      char *s;
  myfunc f;      // compile equally as  void (*f)();

Wie Sie sehen können, können Sie einfach den typedefed- Namen durch die oben angegebene Definition ersetzen.

Die Schwierigkeit liegt im Zeiger auf die Funktionssyntax und Lesbarkeit in C und C ++, und der typedef kann die Lesbarkeit solcher Deklarationen verbessern. Die Syntax ist jedoch angemessen, da Funktionen - anders als andere einfachere Typen - einen Rückgabewert und Parameter haben können, also die manchmal langwierige und komplexe Deklaration eines Pointers zur Funktion.

Die Lesbarkeit kann mit Pointern auf Funktionsarrays und einigen anderen, noch indirekteren Varianten sehr schwierig werden.

Um deine drei Fragen zu beantworten

  • Warum wird typedef verwendet? Erleichtern das Lesen des Codes - insbesondere für Zeiger auf Funktionen oder Strukturnamen.

  • Die Syntax sieht ungerade aus (in der Deklaration von Zeiger auf Funktion). Diese Syntax ist zumindest beim Beginn nicht offensichtlich zu lesen. Die Verwendung einer typedef Deklaration erleichtert stattdessen das Lesen

  • Wird ein Funktionszeiger erstellt, um die Speicheradresse einer Funktion zu speichern? Ja, ein Funktionszeiger speichert die Adresse einer Funktion. Dies hat nichts mit dem typedef Konstrukt zu tun, das nur das Schreiben / Lesen eines Programms erleichtert; Der Compiler erweitert nur die Typdefinition, bevor der eigentliche Code kompiliert wird.

Beispiel:

typedef int (*t_somefunc)(int,int);

int product(int u, int v) {
  return u*v;
}

t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456

#include <stdio.h>
#include <math.h>

/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/

// typedef a primitive data type
typedef double distance;

// typedef struct 
typedef struct{
    int x;
    int y;
} point;

//typedef an array 
typedef point points[100]; 

points ps = {0}; // ps is an array of 100 point 

// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)

// prototype a function     
distance findDistance(point, point);

int main(int argc, char const *argv[])
{
    // delcare a function pointer 
    distanceFun_p func_p;

    // initialize the function pointer with a function address
    func_p = findDistance;

    // initialize two point variables 
    point p1 = {0,0} , p2 = {1,1};

    // call the function through the pointer
    distance d = func_p(p1,p2);

    printf("the distance is %f\n", d );

    return 0;
}

distance findDistance(point p1, point p2)
{
distance xdiff =  p1.x - p2.x;
distance ydiff =  p1.y - p2.y;

return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
}






pointers