2012-05-24 40 views
6

Tôi đã đi qua một số mã C++ có những điều sau đây:Có phải typedef tự có hiệu ứng nào không?

typedef Request Request; 

Đây có phải là chỉ là một không-op hoặc thực hiện điều này typedef thực tế đã ảnh hưởng, và nếu như vậy, những gì tác động nó có?

+2

Đã được 'Yêu cầu' được định nghĩa trong cùng một không gian tên? –

+1

Điều này có thể làm điều gì đó nếu 'Yêu cầu 'là một macro. – Mankarse

+2

Bạn có chắc chắn nó không phải là 'typedef struct Request Request'? –

Trả lời

9

Nhận dạng typedef được cho phép nếu tên đã đề cập đến một số loại.

này là hợp pháp:

typedef int Request; 
typedef Request Request; // Redefines "Request" with no effect 

Đây không phải là:

typedef Request Request; // Illegal, first "Request" doesn't name a type. 

Các tiêu chuẩn có một ví dụ cụ thể về vấn đề này. C++ 2003, §7.1.3/2:

Trong một phạm vi không lớp nào đó, một specifier typedef có thể được sử dụng để xác định lại tên của bất kỳ loại khai báo trong rằng phạm vi để tham khảo các loại để mà nó đã đề cập đến. [Ví dụ:

typedef struct s { /* ... */ } s; 
typedef int I; 
typedef int I; 
typedef I I; 

- cuối dụ]

+0

Sự khác nhau giữa chúng là gì? Bài đăng của bạn không đủ rõ ràng, vì tôi thấy cùng một typedef hai lần, nhưng một trong số đó là hợp pháp, khác thì không. – Nawaz

+0

Sự khác biệt giữa khối đầu tiên của tôi và khối thứ hai của tôi là định nghĩa trước của "Yêu cầu". –

0

NếuRequest chỉ được truyền như một tham số nó có vẻ là một opaque pointer.
Phải có một số

typedef struct Request Request 

ở đâu đó trong mã. (xem nhận xét về câu hỏi của bạn)
Điều này được sử dụng để xác định API và ẩn chi tiết triển khai. Vì vậy, sau này bạn có thể thay đổi triển khai mà không cần thay đổi lại API.

Khách hàng không cần phải biết bất kỳ điều gì về loại âm thanh - đó là một loại xử lý.
Mọi thứ bạn muốn làm với nó phải được thực hiện bằng phương pháp api (tạo, xóa, tải, init, ...)
Thông thường, tay cầm Request sẽ được đúc thành một cái gì đó có ý nghĩa hơn trong việc thực hiện api. Điều này đã được/thường được thực hiện trong C.