web-dev-qa-db-fra.com

Puis-je définir une fonction à l'intérieur d'une structure C?

J'essaie de convertir du code C++ en C et je rencontre des problèmes. Comment définir à l'intérieur d'une structure une fonction?

Comme ça:

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

Non, vous ne pouvez pas définir une fonction dans un struct en C.

Vous pouvez avoir un pointeur de fonction dans un struct mais avoir un pointeur de fonction est très différent d'une fonction membre en C++, à savoir qu'il n'y a pas de pointeur implicite this vers le contenant struct exemple.

Exemple artificiel (démo en ligne 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

Vous pouvez cependant avoir un pointeur de fonction dans une structure. mais pas de cette façon

vous pouvez le définir de cette façon

exemple:

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

Non, il n'est pas possible de déclarer une fonction à l'intérieur d'une structure en C.

C'est (une des) différences fondamentales entre C et C++.

Voir ce fil: http://forums.devshed.com/c-programming-42/declaring-function-in-structure-in-c-545529.html

7
Salgar

Dans C, il n'est pas autorisé de définir une méthode à l'intérieur d'un struct. Vous pouvez définir un pointeur de fonction à l'intérieur d'une structure comme suit:

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

Vous devrez affecter le pointeur à une fonction spécifique chaque fois que vous instanciez le struct.

7
epsalon

L'idée est de mettre un pointeur sur une fonction à l'intérieur de la structure. La fonction est ensuite déclarée en dehors de la structure. C'est différent d'une classe en C++ où une fonction est déclarée à l'intérieur de la classe.

Par exemple: voler du code à partir d'ici: 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;
}

test.fun = get_a; affecte la fonction au pointeur dans la structure et test.fun(&test.a); l'appelle.

2
shanet

Vous ne pouvez définir un pointeur de fonction que dans une structure en langage de programmation C différente de C++.

1
Fantasy Shao