2012-09-28 43 views
21

Tôi đang cố gắng chuyển đổi một số mã C++ thành C và tôi đang gặp sự cố. Có thể định nghĩa bên trong cấu trúc một hàm không?có thể xác định hàm bên trong cấu trúc C không?

Như thế này:

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

Trả lời

32

Không, bạn không thể định nghĩa một hàm trong một struct trong C.

Bạn có thể có một con trỏ hàm trong một struct dù nhưng có một con trỏ hàm là rất khác nhau từ một hàm thành viên trong C++, cụ thể là không có con trỏ this tiềm ẩn nào chứa cá thể struct chứa.

giả tạo ví dụ (trực tuyến bản 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

Trong C nó không được phép để xác định một phương pháp bên trong một struct. Bạn có thể định nghĩa một con trỏ hàm bên trong một cấu trúc như sau:

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

Bạn sẽ phải gán con trỏ đến một chức năng cụ thể bất cứ khi nào bạn nhanh chóng struct.

2

Ý tưởng là đặt con trỏ vào hàm bên trong cấu trúc. Hàm này sau đó được khai báo bên ngoài cấu trúc. Điều này khác với một lớp trong C++ trong đó một hàm được khai báo bên trong lớp.

Ví dụ: ăn cắp mã từ đây: 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; 
} 

nơi test.fun = get_a; gán các chức năng để con trỏ trong struct, và test.fun(&test.a); gọi nó.

1

Bạn chỉ có thể xác định con trỏ hàm trong cấu trúc trong ngôn ngữ lập trình C khác với C++.

11

Bạn có thể có một con trỏ hàm trong cấu trúc. nhưng không phải theo cách này

bạn có thể định nghĩa nó theo cách này

dụ:

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; 

} 
Các vấn đề liên quan