2015-04-22 20 views
6

Tôi đã tự hỏi làm thế nào tôi viết một hàm trả về một con trỏ tới một hàm trả về một con trỏ hàm, mà không có một typedef. Ví dụ một hàm trả về một con trỏ hàm có thể được xác định như sau:Làm cách nào để khai báo một hàm trả về một con trỏ tới một hàm trả về một con trỏ hàm mà không sử dụng một typedef trong C?

type (*f_name(..))(..){..} 

Vì vậy, đây trả về một con trỏ tới một hàm trả về một 'type', bây giờ làm thế nào để bạn khai báo các chức năng nếu 'loại' là một con trỏ hàm. Nhưng như người giám sát của tôi không muốn typedefs sử dụng tôi không thể sử dụng chúng.

Cảm ơn bạn đã giúp đỡ bất kỳ.

+0

Chỉ cần thay 'loại' bằng con trỏ hàm chưa đặt tên. –

+4

Người giám sát của bạn không muốn typedefs? Thật là một ý tưởng kỳ lạ ... Không rõ bạn muốn gì. Bạn có đơn giản muốn một hàm trả về một con trỏ hàm hay bạn muốn nó đệ quy là các hàm trả về hàm-con trỏ? Bạn đã thử những gì? – Eregrith

+0

Làm điều đó với '' typedef'' trước, sau đó giải quyết '' typedef' 'theo cách thủ công. – Philip

Trả lời

7

Đối với các câu hỏi như thế này, có một tiện ích tiện lợi được gọi là cdecl (http://cdecl.org/) dịch giữa các khai báo tiếng Anh và C.

Ví dụ

cdecl> declare f as function (int) returning pointer to function (char) returning pointer to function (void) returning long 

cho câu trả lời

long (*(*f(int))(char))(void) 

và, theo một hướng khác,

cdecl> explain int (*(*g(float))(double, double))(char) 

cho

khai báo g là hàm (float) trả về con trỏ tới hàm (double, double) trả về con trỏ tới hàm (char) return int

+2

BTW, có giao diện web cho nó: http: // cdecl.org/ – myaut

+1

Yup, chỉ cần thêm URL. Cảm ơn cho những người đứng đầu lên. – drRobertz

+0

Cảm ơn, tiện ích này là tốt đẹp và câu trả lời nhất định là những gì tôi đang tìm kiếm. – user3711004

3

Đầu tiên chúng ta viết hàm lấy int và trả về float.

float First(int f) 
{ 
    return (float)f ; 
} 

Sau đó, chúng tôi viết hàm không lấy gì và trả về con trỏ đến hàm lấy int và trả về phao.
Con trỏ này cùng loại với First.

float (*Second(void))(int) 
{ 
    float (*f)(int) = First ; 

return f ; 
} 

Cuối cùng, chúng tôi viết một hàm lấy char và trả về con trỏ đến hàm lấy int và trả về phao. Con trỏ này cùng loại với Second.

float (*(*Third(char c))(void))(int) 
{ 
    (void)c ; 
    float (*(*s)(void))(int) = Second ; 

return s ; 
} 

Nếu bạn đặt mẫu cùng nhau, cú pháp kỳ lạ bắt đầu có ý nghĩa:

float  First     (int) ; 
float ( *Second   (void))(int) ; 
float (*(*Third(char))(void))(int) ; 

Sự khác biệt duy nhất để trả lại một con trỏ phi chức năng là thông số chức năng gợi ý đi ở cuối của tuyên bố và các dấu ngoặc vuông:

  type* Name(void) ; 
function_type (*Name(void))(int) ; 
Các vấn đề liên quan