it-swarm.com.de

Kann ich eine Funktion in einer C-Struktur definieren?

Ich versuche, etwas C++ - Code in C umzuwandeln und stelle einige Probleme gegenüber. Wie kann ich innerhalb einer Struktur eine Funktion definieren?

So was:

 typedef struct  {
    double x, y, z;
    struct Point *next;
    struct Point *prev;
    void act() {sth. to do here};
} Point;
42
DCuser

Nein, Sie können keine Funktion innerhalb eines struct in C definieren.

Sie können einen Funktionszeiger in einem struct haben, aber ein Funktionszeiger unterscheidet sich sehr von einer Elementfunktion in C++, dh es gibt keinen impliziten this Zeiger auf den enthaltenden struct Instanz.

Erfundenes Beispiel (Online-Demo http://ideone.com/kyHlQ ):

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

struct point
{
    int x;
    int y;
    void (*print)(const struct point*);
};

void print_x(const struct point* p)
{
    printf("x=%d\n", p->x);
}

void print_y(const struct point* p)
{
    printf("y=%d\n", p->y);
}

int main(void)
{
    struct point p1 = { 2, 4, print_x };
    struct point p2 = { 7, 1, print_y };

    p1.print(&p1);
    p2.print(&p2);

    return 0;
}
54
hmjd

Sie können jedoch einen Funktionszeiger in einer Struktur haben. aber nicht so

sie können es auf diese Weise definieren

Beispiel:

typedef struct cont_func 
{
    int var1;
    int (*func)(int x, int y);
    void *input;
} cont_func;


int max (int x, int y)
{
    return (x > y) ? x : y;
}

int main () {
   struct cont_func T;

   T.func = max;
}
14
MOHAMED

Nein, es ist nicht möglich, eine Funktion innerhalb einer Struktur in C zu deklarieren.

Das ist einer der grundlegenden Unterschiede zwischen C und C++.

Siehe diesen Thread: http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c-545529.html

7
Salgar

In C darf keine Methode innerhalb eines struct definiert werden. Sie können einen Funktionszeiger in einer Struktur wie folgt definieren:

typedef struct  {
  double x, y, z;
  struct Point *next;
  struct Point *prev;
  void (*act)();
} Point;

Sie müssen den Zeiger immer dann einer bestimmten Funktion zuweisen, wenn Sie struct instanziieren.

7
epsalon

Die Idee ist, einen Zeiger auf eine Funktion innerhalb der Struktur zu setzen. Die Funktion wird dann außerhalb der Struktur deklariert. Dies unterscheidet sich von einer Klasse in C++, in der eine Funktion innerhalb der Klasse deklariert ist.

Beispiel: Code von hier stehlen: http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c-545529.html

struct t {
    int a;
    void (*fun) (int * a);
} ;

void get_a (int * a) {
    printf (" input : ");
    scanf ("%d", a);
}

int main () {
    struct t test;
    test.a = 0;

    printf ("a (before): %d\n", test.a);
    test.fun = get_a;
    test.fun(&test.a);
    printf ("a (after ): %d\n", test.a);

    return 0;
}

dabei weist test.fun = get_a; dem Zeiger in der Struktur die Funktion zu, und test.fun(&test.a); ruft sie auf.

2
shanet

Sie können in einer Struktur in der Programmiersprache C nur einen Funktionszeiger definieren, der sich von C++ unterscheidet.

1
Fantasy Shao