2012-07-08 42 views
8

Tôi có tuyên bố sau đây trong một tập tin tiêu đề:typedef có hiệu ứng phụ khai báo chuyển tiếp?

struct my_struct; 
int func(struct my_struct* s);  // Passing struct my_struct* 

Nếu không có tờ khai chuyển tiếp, trình biên dịch sẽ rõ ràng cho this error:

error: 'struct my_struct' declared inside parameter list

Tuy nhiên, nếu tôi thay thế khai báo chuyển tiếp my_struct bằng typedef và cập nhật khai báo hàm cho phù hợp, nó compiles fine:

typedef struct my_struct my_struct_t; 
int func(mystruct_t* s);    // Passing my_struct_t* 

Tò mò, nếu tôi giữ typedef, nhưng sử dụng tờ khai ban đầu my_struct, nó also compiles:

typedef struct my_struct my_struct_t; 
int func(struct my_struct* s);  // Passing struct my_struct* 

Có ai khác nhận thấy rằng? Hành vi đó có phải là một tác dụng phụ không?

+2

Máy đánh chữ cũng hoạt động như một tờ khai chuyển tiếp, nó mang tên kiểu vào phạm vi. –

+0

@DanielFischer Có, tôi đã nhận thấy rằng :) nhưng tôi không thể tìm thấy bất cứ điều gì trong tiêu chuẩn nêu rõ điều đó. Tôi đã bỏ lỡ một cái gì đó? –

+0

Không cần khai báo chuyển tiếp để tạo một con trỏ tới một cấu trúc. Nó chỉ là một quy ước. Liệu tôi có sai? –

Trả lời

7

Trong phần 6.2.1, khoản 7:

Cấu trúc, công đoàn, và đếm thẻ có phạm vi bắt đầu ngay sau khi sự xuất hiện của thẻ trong một loại Speci fi er rằng tuyên bố thẻ. Mỗi hằng số liệt kê có phạm vi mà bắt đầu ngay sau khi sự xuất hiện của điều tra viên của nó trong một danh sách điều tra viên. Bất kỳ số điện thoại nào khác có phạm vi bắt đầu ngay sau khi người khai báo hoàn tất.

Và trong 6.7.2.3, khoản 8:

Nếu một loại Speci fi er của mẫu struct-hoặc-đoàn identi fi er xảy ra ngoài như là một phần của một trong các hình thức trên, và không khai báo khác của mã số như một thẻ hiển thị, sau đó nó khai báo một cấu trúc không hoàn chỉnh hoặc kiểu kết hợp và tuyên bố định danh là thẻ thuộc loại đó.

Do đó tuyên bố loại cấu trúc không đầy đủ.

+0

+1 Tuyệt đẹp! Cảm ơn rất nhiều! –

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