2013-03-25 41 views
5

Tôi đã gặp phải một vấn đề đặc biệt. Nó có thể là tốt nhất để chỉ cho bạn những gì tôi đang cố gắng làm và sau đó giải thích nó.Tuyên bố chuyển tiếp của con trỏ hàm typedef

typedef void functionPointerType (struct_A * sA); 

typedef struct 
{ 
    functionPointerType ** functionPointerTable; 
}struct_A; 

Về cơ bản, tôi có một cấu trúc struct_A với một con trỏ đến một bảng con trỏ chức năng, những người có một tham số kiểu struct_A. Nhưng tôi không chắc chắn làm thế nào để có được biên dịch này, như tôi không chắc chắn như thế nào hoặc nếu có thể chuyển tiếp tuyên bố này.

Bất cứ ai biết cách này có thể đạt được?

chỉnh sửa: sửa chữa nhỏ trong mã

Trả lời

9

Chuyển tiếp tuyên bố như bạn đề nghị:

/* Forward declare struct A. */ 
struct A; 

/* Typedef for function pointer. */ 
typedef void (*func_t)(struct A*); 

/* Fully define struct A. */ 
struct A 
{ 
    func_t functionPointerTable[10]; 
}; 

Ví dụ:

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

struct A; 

typedef void (*func_t)(struct A*); 

struct A 
{ 
    func_t functionPointerTable[10]; 
    int value; 
}; 

void print_stdout(struct A* a) 
{ 
    printf("stdout: %d\n", a->value); 
} 

void print_stderr(struct A* a) 
{ 
    fprintf(stderr, "stderr: %d\n", a->value); 
} 

int main() 
{ 
    struct A myA = { {print_stdout, print_stderr}, 4 }; 

    myA.functionPointerTable[0](&myA); 
    myA.functionPointerTable[1](&myA); 
    return 0; 
} 

Output:

 
stdout: 4 
stderr: 4 

Xem demo trực tuyến http://ideone.com/PX880w.


Như những người khác đã đề cập đến nó có thể thêm:

typedef struct A struct_A; 

trước con trỏ hàm typedef và định nghĩa đầy đủ của struct A nếu nó là thích hợp hơn để bỏ qua các từ khóa struct.

+0

cú pháp cho điều này luôn luôn ném tôi ra. – Claudiu

+0

"Như những người khác đã đề cập" Thật vậy. Bạn cũng có thể chỉ cần đặt nó vào câu trả lời của bạn và sau đó tôi có thể xóa của tôi. Tôi nghĩ rằng nó sẽ làm cho câu trả lời của bạn tốt hơn và đó là một trong đó đã tăng lên hàng đầu. –

+0

@DavidHeffernan, cảm ơn. Ví dụ này được giả định và tính hữu ích của 'typedef' bổ sung không thực sự được truyền tải (' struct A' hoặc 'struct_A'). – hmjd

1

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm:

//forward declaration of the struct 
struct _struct_A;        

//typedef so that we can refer to the struct without the struct keyword 
typedef struct _struct_A struct_A;    

//which we do immediately to typedef the function pointer 
typedef void functionPointerType(struct_A *sA); 

//and now we can fully define the struct  
struct _struct_A       
{ 
    functionPointerType ** functionPointerTable; 
}; 
0

Có một cách khác để làm điều đó:

typedef struct struct_A_ 
{ 
    void (** functionPointerTable) (struct struct_A_); 
}struct_A; 


void typedef functionPointerType (struct_A); 
Các vấn đề liên quan