2011-12-19 66 views
16

Tôi hơi bối rối về cách khai báo một con trỏ hàm trong một tệp tiêu đề. Tôi muốn sử dụng nó trong chính và một tập tin gọi là menus.c và khai báo nó trong menu.h Tôi giả sử. Chúng tôi muốn khởi tạo để trỏ đến một chức năng nhất định.Làm thế nào để khai báo con trỏ hàm trong header và c-file?

nó trông như thế này:

void (*current_menu)(int); 

sao chúng ta viết gì trong menus.c, menus.h và chính?

Trả lời

0

Bản thân hàm con trỏ không có định nghĩa hàm. Nó không có gì hơn một con trỏ đến một kiểu, kiểu được chỉ định bởi kiểu trả về của hàm và danh sách tham số. Những gì bạn cần làm là định nghĩa một hàm có cùng danh sách tham số và kiểu trả về, sau đó sử dụng hàm con trỏ của bạn để giữ địa chỉ của hàm đó. Sau đó bạn có thể gọi hàm thông qua con trỏ.

18

Một con trỏ hàm vẫn là một con trỏ, có nghĩa là nó vẫn là một biến.

Nếu bạn muốn biến hiển thị từ một số tệp nguồn, giải pháp đơn giản nhất là khai báo nó extern trong tiêu đề, với định nghĩa ở nơi khác.

Trong một tiêu đề:

extern void (*current_menu)(int); 

Trong một tập tin nguồn:

void (*current_menu)(int) = &the_func_i_want; 
+0

ty, hiện tại nó hoạt động – user1106072

+2

dấu và không thực sự cần thiết – Dave

+1

Điều đó đúng, @Dave. Trong C, đó là một sự lựa chọn phong cách của tôi cho rõ ràng. Trong C++ đôi khi nó được yêu cầu trong các bối cảnh mẫu nhất định, vì vậy tôi chỉ làm điều đó cho tính nhất quán. –

6

Nó rất hữu ích để sử dụng typedef với chức năng gợi ý, vì vậy bạn có thể đặt tên cho loại một cái gì đó mô tả :

typedef void (*MenuFunction)(int); 

Sau đó, bạn sẽ có một biến toàn cầu của loại hình này, có lẽ trong menus.c, và tuyên bố (với extern) trong menus.h:

static void my_first_menu_function(int x) 
{ 
    printf("the menu function got %d\n", x); 
} 

MenuFunction current_menu = my_first_menu_function; 

Từ main.c, sau đó bạn có thể làm:

#include "menu.h" 

current_menu(4711); 

để gọi bất kỳ chức năng nào hiện đang được trỏ bởi current_menu.

+0

Rất đúng! 'function ' cũng có sẵn nếu bạn có quyền truy cập để tăng hoặc C++ 11. –

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