2012-09-28 19 views
21

Estoy tratando de convertir algunos códigos C++ a C y estoy teniendo problemas. ¿Es posible definir dentro de una estructura una función?posible definir una función dentro de una estructura C?

De esta manera:

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

Respuesta

32

No, no se puede definir una función dentro de un struct en C.

Usted puede tener un puntero de función en una struct aunque pero tener un puntero de función es muy diferente de una función miembro en C++, es decir, no hay un puntero this implícito en la instancia que contiene struct.

ejemplo Contrived (demostración en línea 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; 
} 
7

En C no está permitido definir un método dentro de un struct. Se podría definir un puntero de función dentro de una estructura de la siguiente manera:

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

que tendrá que asignar el puntero a una función específica cada vez que se ejemplariza la struct.

2

La idea es poner un puntero a una función dentro de la estructura. La función se declara fuera de la estructura. Esto es diferente de una clase en C++ donde se declara una función dentro de la clase.

Por ejemplo: el robo de código desde aquí: 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; 
} 

donde test.fun = get_a; asigna la función al puntero en la estructura, y test.fun(&test.a); lo llama.

1

Solo puede definir un puntero de función en una estructura en lenguaje de programación C que es diferente de C++.

11

Sin embargo, puede tener un puntero a la función en una estructura. pero no de esta manera

se puede definir de esta manera

ejemplo:

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; 

} 
Cuestiones relacionadas