2012-09-28 11 views

Antwort

32

Nein, man kann nicht eine Funktion innerhalb eines struct in C definieren

Sie können einen Funktionszeiger in einem struct haben wenn auch nur einen Funktionszeiger, die sehr verschieden von eine Memberfunktion in C++, dh es gibt keinen impliziten this Zeiger auf die enthaltende struct Instanz.

konstruiertes 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; 
} 
7

In C es nicht erlaubt ist, ein Verfahren in einem struct zu definieren. Sie könnten einen Funktionszeiger innerhalb einer Struktur wie folgt definieren:

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

Sie den Zeiger auf eine bestimmte Funktion zuweisen müssen, wenn Sie die struct instanziiert.

2

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 in der Klasse deklariert ist.

Zum Beispiel: Diebstahl-Code von hier: 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; 
} 

wo test.fun = get_a; die Funktion auf den Zeiger in der Struktur zuweist, und test.fun(&test.a); nennt.

1

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

11

Sie können jedoch einen Funktionszeiger in einer Struktur haben. aber nicht auf diese Weise

können Sie 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; 

} 
Verwandte Themen