2013-08-27 39 views
8

typedef int (xxx)(int yyy); dường như xác định con trỏ hàm có tên xxx trỏ đến hàm có tham số nguyên yyy.Cách hiểu "typedef int (xxx) (int yyy);"?

Nhưng tôi không thể hiểu cú pháp đó ... Có thể ai giải thích tốt không?


Tôi tìm thấy typedef int xxx(int yyy); vẫn hoạt động. Bất kỳ sự khác biệt nào giữa chúng?

+1

Bạn có thể tìm thấy [giải thích này] (http://c-faq.com/decl/spiral.anderson.html) hữu ích. – icktoofay

+0

Bạn bỏ lỡ một '*', 'typedef int (* xxx) (int yyy);' định nghĩa một con trỏ hàm –

+0

@AlterMann Không, nó không phải là mã của tôi. Tôi nghĩ rằng nó định nghĩa một con trỏ hàm, nhưng có vẻ như không, tôi không có ý tưởng .. – Sayakiss

Trả lời

15

Điều này xác định loại hàm, không phải là loại con trỏ hàm.

Mẫu với typedef là mẫu sửa đổi bất kỳ tuyên bố nào thay vì khai báo một đối tượng, nó khai báo một bí danh cho loại đối tượng sẽ có.

này là hoàn toàn hợp lệ:

typedef int (xxx)(int yyy); // Note, yyy is just an unused identifier. 
// The parens around xxx are also optional and unused. 

xxx func; // Declare a function 

int func(int arg) { // Define the function 
    return arg; 
} 

C và C++ ngôn ngữ cụ thể, và thương xót, không cho phép sử dụng một tên typedef như toàn bộ gõ một định nghĩa hàm.

+1

Giải thích tuyệt vời! Sẽ rất hữu ích khi cho biết chức năng này được gọi như thế nào, ví dụ: liệu có thể sử dụng tên 'typedef' trong lời gọi hàm hay không. – verbose

+3

@verbose Hàm này được gọi giống như bất kỳ hàm nào khác. Sự tồn tại của tên typedef không ảnh hưởng đến bất cứ điều gì. Không chắc chắn cách thức áp dụng cho cuộc gọi. – Potatoswatter

+0

bạn có thể sử dụng loại hàm này để xác định con trỏ hàm như trong ví dụ tôi đã chỉ ra để cải thiện khả năng đọc. –

0

Có, typedef int (xxx)(int yyy); giống với typedef int xxx(int yyy); xác định loại chức năng. Bạn có thể tìm thấy một ví dụ từ trang 156 C 11 dự thảo tiêu chuẩn N1570. Trích từ trang đó,

All three of the following declarations of the signal function specify exactly the same type, the first without making use of any typedef names.

typedef void fv(int), (*pfv)(int); 
    void (*signal(int, void (*)(int)))(int); 
    fv *signal(int, fv *); 
    pfv signal(int, pfv); 
0

Nếu bạn có một số declarator x trong khai T x, sau đó T x(t1 p1, t2 p2) nghĩa chức năng với params p1, p2, trở về cùng loại như declarator x đã có trước khi .

Dấu ngoặc đơn xung quanh người khai báo có nghĩa là áp dụng các công cụ sửa đổi bên trong dấu ngoặc đơn đầu tiên.

Trong trường hợp của bạn, không có công cụ sửa đổi nào bên trong dấu ngoặc đơn. Điều này có nghĩa là không cần chúng.

Nguyên mẫu hàm có nghĩa là Có một hàm ở đâu đó có chữ ký này và tên của nó là Blah.

Typedef với nguyên mẫu của hàm có nghĩa là Cho phép đặt tên blah thành chữ ký hàm. Điều này không ngụ ý rằng bất kỳ chức năng nào có chữ ký này đều tồn tại. Tên này có thể được sử dụng làm loại. Ví dụ:

typedef int xxx(int yyy); 

xxx *func_ptr;  // Declaration of a variable that is a pointer to a function. 
xxx *func2(int p1); // Function that returns a pointer to a function. 
+0

'T x' sẽ là khai báo và' x' sẽ là người khai báo. – Potatoswatter

+0

Phải, tôi đã nghĩ điều này nhưng bài viết của tôi không tốt. Tôi sẽ cập nhật. –

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