2012-04-13 28 views
7

Có thể sử dụng các biểu thức hàm trong C? Ví dụ, tôi có đoạn mã sau mã (bên trong main chức năng):C có hỗ trợ các biểu thức hàm không?

void print_line(char *data) { 
    printf("%s\n", data); 
} 

// print all elements in my_list 
list_foreach(&my_list, print_line); 

Tôi muốn làm điều gì đó giống như thay vì điều này:

list_foreach(&my_list, void (char *data) { 
    printf("%s\n", data); 
}); 

là bất cứ điều gì như thế có thể trong C?

+0

Đừng làm cho tôi sai, nhưng đó là lý do tại sao tôi yêu C++, nó mang lại cho bạn điều này và nhiều hơn nữa với giá rẻ hơn C! – AraK

+1

@AraK: Đối với giá rẻ hơn C? "Rẻ hơn" có nghĩa là gì ở đây? Cách C++ có thể chậm hơn, phải không? – thejh

+1

Rẻ hơn ở đây có nghĩa là trình biên dịch có thể thu gọn sự trừu tượng để có được hiệu suất tối đa. So sánh ví dụ việc sử dụng một functor (hoặc lambda), với việc sử dụng các con trỏ hàm. Việc giới thiệu bí danh không giúp ích gì nhiều trong việc tạo ra mã tốt nhất. – AraK

Trả lời

7

Trong một từ, Không. Ít nhất không phải trong cú pháp giống như Javascript. Con trỏ chức năng gần giống như bạn sẽ nhận được. Có rất ít sự khác biệt giữa hai cú pháp. Nếu bạn đang tìm kiếm hành vi đóng cửa hoặc chức năng bên trong, thì bạn chắc chắn sẽ không sớm thấy chúng.

1

Chắc chắn không phải bất cứ thứ gì như khối Objective-C, bao đóng, v.v ... Nhưng việc sử dụng các con trỏ chức năng thay thế là gì?

+1

Đó là những gì anh ta đang làm trong đoạn mã đầu tiên của mình. – Chuck

+0

@Chuck hmm ... thực sự có. –

4

Không có trong tiêu chuẩn C, không. Apple đã giới thiệu một tính năng được gọi là các khối sẽ cho phép bạn làm điều này và nó đã được gửi cho tiêu chuẩn hóa, nhưng nó chưa có (nếu nó sẽ bao giờ làm cho nó thông qua). cú pháp của Apple trông như thế này:

list_foreach(my_list, ^(char *data) { 
    printf("%s\n", data); 
}); 

Đó là cơ bản chức năng cú pháp con trỏ với * thay thế bằng ^ (và suy luận cho các kiểu trả về trong các biểu thức).

+0

Ồ, nghe có vẻ thú vị. Vâng, miễn là tôi không thể sử dụng nó trong gcc, tôi có lẽ sẽ không sử dụng nó. :( – thejh

+0

Tôi có thể tìm thấy nó ở đâu? Đó là phần mở rộng gcc C cho kiến ​​trúc của Apple hoặc một trình biên dịch khác? – Jack

+0

@Jack: Nó nằm trong nhánh của GCC hiện tại không được hỗ trợ của Apple và nó cũng nằm trong Clang (http://clang.llvm.org) Apple có vai trò là nhà tài trợ chính của công ty (Nếu bạn sử dụng Clang, tôi nghĩ bạn sẽ muốn bỏ cờ -fblocks để kích hoạt phần mở rộng ngôn ngữ.) – Chuck

2

Bạn không thể làm điều đó ở đồng bằng C. Tuy nhiên bạn có thể giả mạo này với vĩ mô:

#define FOR_EACH(type, x, array, size, code) \ 
       do { \ 
         int i; \ 
         for (i=0; i<size; ++i) { \ 
         type x = array[i]; \ 
         code \ 
         } \ 
       } while(0) 

int main() 
{ 
    int arr[] = {0,1,2,3,4,5,6}; 
    FOR_EACH(int, x, arr, 7, printf("%d ", 1 << x);); 

    return 0; 
} 

EDIT
Tôi đã dụ được nhiều di động tái mã hóa - mà không sử dụng khối GCC sự mở rộng.

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