void (*func)(int(*[ ])());
Trả lời
Nó không phải là một tuyên bố, đó là một tuyên bố.
Nó tuyên bố func
làm con trỏ đến hàm trả về void và lấy một đối số kiểu int (*[])()
, mà chính nó là con trỏ trỏ tới hàm trả về int và lấy số đối số cố định nhưng không xác định.
đầu ra cdecl cho các ngươi ít đức tin:
cdecl> explain void (*f)(int(*[ ])());
declare f as pointer to function (array of pointer to function returning int) returning void
"cố định nhưng không xác định số đối số" - câu hỏi cũng được gắn thẻ C++, trong trường hợp đó loại chức năng thứ hai mất chính xác không đối số. –
Thẻ C++ được thêm bởi một người nào đó không phải là poster gốc, sau khi tôi trả lời. Một sự chuyển động quá thông minh-by-một nửa, bởi cuốn sách của tôi. – caf
Gosh, đó là lén lút. Nó không bao giờ rõ ràng khi ai đó nói "C/C++" cho dù họ đã nói nó bởi vì họ nghĩ rằng câu trả lời là như nhau cho cả hai ngôn ngữ, bởi vì họ nghĩ rằng câu trả lời là khác nhau giữa hai ... –
void (*func)(blah);
là một con trỏ tới một hàm dùng blah
như một cuộc tranh cãi, nơi blah
chính nó là int(*[ ])()
là một mảng của con trỏ hàm.
Đây là hướng dẫn trên tờ khai C đọc:
http://www.ericgiguere.com/articles/reading-c-declarations.html
Thủ tục chung cho việc đọc declarators lông là để tìm ra định danh tận cùng bên trái và làm việc theo cách của bạn ra, nhớ rằng []
và ()
ràng buộc trước khi *
(tức , *a[]
là một mảng con trỏ, không phải là con trỏ tới mảng). Trường hợp này được thực hiện một chút khó khăn hơn do thiếu một số nhận dạng trong danh sách tham số, nhưng một lần nữa, []
liên kết trước *
, vì vậy chúng tôi biết rằng *[]
cho biết một loạt các nhà thơ.
Vì vậy, cho
void (*func)(int(*[ ])());
chúng ta phá vỡ nó xuống như sau:
func -- func
*func -- is a pointer
(*func)( ) -- to a function taking
(*func)( [ ] ) -- an array
(*func)( *[ ] ) -- of pointers
(*func)( (*[ ])()) -- to functions taking
-- an unspecified number of parameters
(*func)(int(*[ ])()) -- returning int
void (*func)(int(*[ ])()); -- and returning void
Điều này sẽ như thế nào trong thực tế sẽ là một cái gì đó như sau:
/**
* Define the functions that will be part of the function array
*/
int foo() { int i; ...; return i; }
int bar() { int j; ...; return j; }
int baz() { int k; ...; return k; }
/**
* Define a function that takes the array of pointers to functions
*/
void blurga(int (*fa[])())
{
int i;
int x;
for (i = 0; fa[i] != NULL; i++)
{
x = fa[i](); /* or x = (*fa[i])(); */
...
}
}
...
/**
* Declare and initialize an array of pointers to functions returning int
*/
int (*funcArray[])() = {foo, bar, baz, NULL};
/**
* Declare our function pointer
*/
void (*func)(int(*[ ])());
/**
* Assign the function pointer
*/
func = blurga;
/**
* Call the function "blurga" through the function pointer "func"
*/
func(funcArray); /* or (*func)(funcArray); */
+1 cho đủ tốt, hãy thử giải thích cách đọc biểu thức và ví dụ đó. –
+1, đẹp nhất :) –
+1 để phân tích cú pháp khi bắt đầu. Tốt đẹp! –
Geordi
là bot C++, cho phép huấn luyện điều này:
<litb> geordi: {} void (*func)(int(*[ ])());
<litb> geordi: -r << ETYPE_DESC(func)
<geordi> lvalue pointer to a function taking a pointer to a pointer to a nullary function
returning an integer and returning nothing
Nó có thể làm được nhiều điều hữu ích, như hiển thị tất cả các tham số tờ khai (điều này, trên thực tế, chỉ là phù hợp với nguyên C++
tên quy tắc ngữ pháp):
<litb> geordi: show parameter-declarations
<geordi> `int(*[ ])()`.
Hãy làm điều đó theo hướng ngược lại:
<litb> geordi: {} int func;
<litb> geordi: make func a pointer to function returning void and taking array of pointer to
functions returning int
<litb> geordi: show
<geordi> {} void (* func)(int(*[])());
Nó thực hiện bất kỳ điều gì bạn đưa ra, nếu bạn yêu cầu. Nếu bạn được đào tạo nhưng chỉ quên một số quy tắc dấu ngoặc đơn đáng sợ, bạn cũng có thể kết hợp mô tả loại C++ và kiểu geordi:
<litb> geordi: make func a (function returning void and taking (int(*)()) []) *
<geordi> {} void (* func)(int(*[])());
Hãy vui vẻ!
- 1. Giải thích câu lệnh JavaScript sau?
- 2. Đây có phải là câu lệnh C hợp lệ không?
- 3. Bạn có thể giải thích việc tiêm SQL này không?
- 4. Bạn có thể giải thích các biểu thức lambda không?
- 5. Os.path: bạn có thể giải thích hành vi này không?
- 6. Việc tối ưu hóa ORDER BY có hiệu lực trong câu lệnh SELECT sau đây không?
- 7. Bạn có thể giải thích điều này về đóng gói?
- 8. Java Câu hỏi: Có thể có câu lệnh chuyển đổi trong một câu lệnh khác không?
- 9. Bạn có giải thích việc đặt hàng khóa không?
- 10. Bạn có thích các ngôn ngữ cho phép bạn đặt "sau đó" trước "if" không?
- 11. Có thể/Bạn có nên ném ngoại lệ trong câu lệnh chuyển đổi C# không?
- 12. Bạn có sử dụng câu lệnh "chung" trong Python không?
- 13. Bạn có thể giải thích hành vi generics này và nếu tôi có cách giải quyết khác không?
- 14. Làm thế nào bạn có thể viết nhiều câu trong câu lệnh 'if' dễ hiểu?
- 15. Ai đó có thể giải thích đoạn trích này (Tại sao có những niềng răng ở đây)?
- 16. Ai đó có thể giải thích MustOverride?
- 17. Câu lệnh kiểu có phạm vi có thể không?
- 18. Có thể ai đó giải thích __declspec (trần truồng) không?
- 19. Bạn có thể giải thích hai ví dụ javascript này không?
- 20. Bạn có thể giải thích sự khác biệt giữa StrictMock và Partialmock không?
- 21. Bạn có thể giải thích chương trình 'Hello world' này không?
- 22. Có thể sử dụng câu lệnh if trong #define không?
- 23. Có thể sử dụng lệnh gọi/cc để thực hiện đệ quy không?
- 24. Ai đó có thể giải thích rõ hơn Bộ giải mã/Bộ giải mã không?
- 25. Có ai có thể giải thích về OAuth không?
- 26. Bạn có thể gửi nhị phân ứng dụng iPhone với các câu lệnh NSLog không?
- 27. Câu lệnh có thể có cả = và == như thế nào?
- 28. Trong bash, bạn có thể sử dụng lệnh gọi hàm làm điều kiện trong câu lệnh if không?
- 29. Ai đó có thể giải thích attr?
- 30. "Không thể giải thích" lõi dump
Xem http: // stackoverflow.com/questions/1448849/cách khai báo-phức tạp-chức năng-khai báo – pmg