Câu hỏi này không quá cụ thể; nó thực sự cho C làm giàu của riêng tôi và tôi hy vọng những người khác có thể tìm thấy nó hữu ích là tốt.Các chức năng ẩn danh bằng cách sử dụng các biểu thức câu lệnh GCC
Tuyên bố từ chối trách nhiệm: Tôi biết nhiều người sẽ có xung để phản hồi "nếu bạn đang cố gắng thực hiện FP thì chỉ cần sử dụng ngôn ngữ chức năng". Tôi làm việc trong một môi trường nhúng mà cần phải liên kết với nhiều thư viện C khác, và không có nhiều không gian cho nhiều libs chia sẻ lớn hơn và không hỗ trợ nhiều thời gian chạy ngôn ngữ. Hơn nữa, phân bổ bộ nhớ động là ra khỏi câu hỏi. Tôi cũng thực sự tò mò.
Nhiều người trong số chúng ta đã thấy điều này vĩ mô tiện lợi C cho các biểu thức lambda:
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
Và một cách sử dụng ví dụ là:
int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example
Sử dụng gcc -std=c89 -E test.c
, lambda mở rộng để:
int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });
Vì vậy, đây là những câu hỏi của tôi:
Chính xác thì dòng int (* X) là gì; khai báo? Tất nhiên, int * X; là một con trỏ trỏ đến số nguyên, nhưng hai số này khác nhau như thế nào?
Nhìn vào macro được trừ, cái gì cuối cùng làm
__fn__
làm gì? Nếu tôi viết hàm kiểm travoid test() { printf("hello"); } test;
- tức thì sẽ phát ra lỗi. Tôi không hiểu cú pháp đó.Điều này có ý nghĩa gì đối với việc gỡ lỗi? (Tôi đang có kế hoạch thử nghiệm bản thân mình với điều này và gdb, nhưng kinh nghiệm hoặc ý kiến của người khác sẽ là tuyệt vời). Điều này sẽ vít lên phân tích tĩnh?
Đây không phải là ANSI C. –
Ngoài ra, tôi không thấy 'int (* X);' ở bất kỳ đâu. –
Nó không có trong đó như vậy. Trong khi cố gắng tìm ra cú pháp, tôi hơi bối rối rằng int (* X); biên dịch, nhưng không thực sự chắc chắn những gì nó được xác định .. –