2010-01-13 55 views
11

Tôi cố gắng để hiểu những gì các dòng sau của mã C tồi tệ nhất từ ​​trước đến nay-thấy (từ dự án uboot) có nghĩa là:C - Dòng này có ý nghĩa gì?

rc = ((ulong (*)(bd_t *, int, char *[]))addr) (bd, --argc, &argv[1]); 

nó là gì? Một cuộc gọi chức năng? Có thể đọc được không?

Cảm ơn trước sự giúp đỡ của bạn!

+0

Bạn có thể cho chúng tôi biết loại khai báo của các biến khác nhau có trong dòng này không? –

+3

Nó có thể đọc được nhiều hơn không? Địa ngục không! Obfuscate nó! –

+0

@David: Tôi xin lỗi, nhưng tôi không biết. Tôi vừa mới mở dự án này và đang cố gắng hiểu những gì là gì. – psihodelia

Trả lời

34

Có, đó là cuộc gọi hàm.

Nó biểu diễn giá trị trong addr tới con trỏ hàm chấp nhận (bd_t *, int, char *[]) làm đối số và trả về ulong và gọi hàm. Nó có thể được có đường vào:

typedef ulong (*bd_function)(bd_t *bd, int argc, char *argv[]); 

bd_function bdfunc = (bd_function) addr; 

rc = bdfunc(bd, --argc, &argv[1]); 

Đây có thể là quá mức cần thiết, để giới thiệu một typedef nếu điều này chỉ xảy ra một lần, nhưng tôi cảm thấy nó giúp ích rất nhiều để có thể nhìn vào kiểu con trỏ chức năng của riêng rẽ.

+7

Vì typedef làm cho điều có thể đọc được, nó không phải là quá mức cần thiết. –

+1

Nó không phải là quá mức trong cùng một cách mà anitbiotics không phải là một phản ứng quá mức với nhiễm trùng. –

12

Nó mô tả addr đến một con trỏ hàm chấp nhận (bd_t *, int, char *[]) làm đối số và trả về một long, sau đó gọi nó với đối số (bd, --argc, &argv[1]).

+0

Phải. Và để trả lời câu hỏi thứ hai, không, nó không thể được thực hiện dễ đọc hơn. – jason

+3

@ Jason: Chắc chắn nó có thể (và nên), xem câu trả lời của thư giãn. –

+3

Nhún vai. Để một lập trình viên C nó hoàn toàn có thể đọc được. –

2

ulong (*)(bd_t *, int, char *[]) là loại một chức năng mà phải mất một con trỏ đến một bd_t, một int, và một con trỏ đến một mảng char, và trả về một ulong.

Mã này được đúc addr đến một chức năng như vậy, và sau đó gọi nó với bd, --argc, và &argv[1] như thông số, và gán kết quả cho rc.

1

Bạn đang định kiểu "addr" thành con trỏ tới hàm trả về ulong nhận bd_t *, int và char * [] làm tham số và sau đó gọi hàm với tham số bd, --argc , & argv [1].

2

addr phải là vị trí trong bộ nhớ để một chức năng giống như

ulong *funcname(bd_t*, int, char*[]) 

và nó được gọi với paramerers như

rc = funcname(bd, --argc, &argv[1]); 
4

Không phải là một câu trả lời trực tiếp câu hỏi của bạn, nhưng có thể là quan tâm:

Bắt đầu tại tên biến (hoặc trong cùng xây dựng nếu không có định danh có mặt. Nhìn bên phải mà không cần nhảy qua dấu ngoặc đơn phải; nói những gì bạn xem. Nhìn lại một lần nữa mà không cần nhảy qua dấu ngoặc đơn; nói những gì bạn thấy. Nhảy ra một mức ngoặc đơn nếu bất kỳ dấu ngoặc đơn nào. Có vẻ đúng; nói những gì bạn thấy. Nhìn sang trái; nói những gì bạn thấy. Tiếp tục theo cách này cho đến khi bạn nói loại loại hoặc loại trả về.

+0

Người downvoter xin vui lòng để lại một bình luận. Cảm ơn. –

+0

LOL. tư vấn tốt :) – psihodelia

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