2016-08-10 19 views
6

tôi có một bữa tiệc thư viện C thứ ba với một cấu trúc mang tính chất tương tự nhưChuyển tiếp tuyên bố cấu trúc vô danh từ C trong C++

typedef struct 
    { 
     ... 
     }A; 

Tập tin này được tự động tạo ra thông qua một chương trình, do đó có thể thay đổi dựa trên một cái gì đó

Bây giờ trong một dự án C++ tôi chấp nhận đối số của loại trên, ví dụ như

void foo(const A & in) 
    { 
    ... 
    } 

Làm thế nào để chuyển tiếp khai báo A trong tệp tiêu đề xác định hàm trên?

Tôi đã thử:

typedef struct A A; 

hoặc

struct A; 

và cũng

typedef A A; 

vì tò mò.

Tuy nhiên những kết quả đó trong lỗi thời gian biên dịch xác định lại loại. Cảm ơn

+0

Bạn không thể bao gồm tệp tiêu đề cho thư viện đã định nghĩa 'typedef struct {...} A;'? – rjp

+0

Đó không phải là một 'cấu trúc' ẩn danh (xem 6.7.2.1p13 trong tiêu chuẩn C). Bạn không thể có 'struct' ẩn danh bên ngoài một 'struct' hoặc' union'. – Olaf

+0

C không phải là C++. Chỉ cần sử dụng tiêu chuẩn C++. Không rõ vấn đề của bạn là gì, tôi không thấy gì cả. Vấn đề gì khi sử dụng tên 'typedef'ed? – Olaf

Trả lời

6

Rất tiếc, bạn đã hết may mắn.

Atypedef cho số struct không được gắn thẻ. Và bạn không thể chuyển tiếp tuyên bố rằng vì bạn không thể chuyển trực tiếp đến điều đó struct.

Bạn có thể thay đổi trình tạo để nó xuất ra typedef struct A { ... } A; không? Sau đó, nó sẽ biên dịch tốt trong cả C và C++, và bạn có thể chuyển tiếp tuyên bố rằng trong C++.

Nếu không, bạn có hai tùy chọn: 1. #include tệp có chứa khai báo struct. 2. Sao chép struct bằng tay. Rõ ràng (1) là nhiều hơn nữa thích hợp hơn.

+2

Nó là một 'cấu trúc' không được gắn thẻ, không được đặt tên. – Olaf

+0

@Olaf: điều đó rất hữu ích. Tôi đang tìm kiếm cụm từ chính xác. – Bathsheba

+0

Chỉ cần làm rõ: Tôi sử dụng thuật ngữ C và chỉ suy luận: thẻ bị thiếu, do đó tôi nghĩ rằng "không được gắn thẻ" sẽ là tên chính xác. – Olaf

1

Bạn không thể, vì không thể chuyển tiếp các bí danh loại. Chỉ các loại thực tế mới có thể.

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