2013-07-29 25 views
12

tôi thấy thông báo cảnh báo này khi biên soạn (gcc 4.6.3, ubuntu) ví dụ:C++ Cảnh báo: loại vô danh không có mối liên kết sử dụng để khai báo biến

struct { 
} a; 

int main() 
{ 
} 


warning: anonymous type with no linkage used to declare variable ‘<anonymous struct> a’ with linkage [enabled by default]. 

GCC không đưa ra cảnh báo này. Chỉ có G ++.

Thêm tĩnh xóa cảnh báo:

static struct { 
} a; 

tôi không thể tìm ra ý nghĩa của nó, tại sao expecially type có liên quan đến linkage. Tôi nghĩ rằng liên kết phụ thuộc vào nơi và làm thế nào một biến được khai báo, nhưng không phải trên các loại biến chính nó.

+1

có liên quan ?? http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41970 – billz

+2

Nếu một trong hai câu trả lời của tôi hoặc câu trả lời khác giúp bạn nên chấp nhận, tôi nhận thấy rằng bạn chỉ chấp nhận một câu trả lời, nếu bạn không chấp nhận câu trả lời, mọi người sẽ ít có khả năng trả lời các câu hỏi của bạn – aaronman

Trả lời

8

Lỗi này là do bạn khai báo biến số a có loại ẩn danh (không có tên tệp sau cấu trúc). Tôi giả định cảnh báo là bởi vì bạn không thể khai báo một biến kiểu đó một lần nữa (không sử dụng decltype). Tôi giả định g++ đưa ra cảnh báo chứ không phải gcc vì C++ có xu hướng trở thành ngôn ngữ khắt khe hơn. Tôi cũng đã thử nghiệm nó với clang++clang và chúng không tạo ra bất kỳ cảnh báo nào ngay cả với -Wall.

Tôi giả sử tĩnh sẽ loại bỏ cảnh báo vì nó chỉ có thể được sử dụng trong một tệp đó (có nghĩa là không có liên kết bên ngoài), sẽ khó sử dụng a trong một tệp khác vì bạn không biết loại đó hoặc có quyền truy cập vào các thành viên của nó.

EDIT: Thật không may theo số link trong cảnh báo thực sự là lỗi (tuy nhiên là nhỏ) và đã được sửa.

+2

Giả sử theo liên kết @billz đăng này thực sự là một lỗi, hãy truy cập vào số – aaronman

12

Điều này có nghĩa là biến a có liên kết, ví dụ: có thể hiển thị trong các đơn vị dịch thuật khác. Tuy nhiên loại ẩn danh của nó chỉ có liên kết nội bộ (không có liên kết bên ngoài) nên bạn không thể truy cập biến số a trong bất kỳ đơn vị dịch nào khác vì bạn không thể truy cập loại của nó.

Đặt biến tĩnh sẽ cung cấp liên kết nội bộ và do đó không phải loại cũng như biến sẽ không hiển thị trong các đơn vị dịch khác.

Tôi không chắc chắn (không truy cập vào trình biên dịch để kiểm tra) nếu một không gian tên ẩn danh sẽ phục vụ cùng một mục đích trong trường hợp này.

+1

Câu trả lời của tôi là tương tự, ngay cả khi bạn được viết tốt hơn, nhưng theo nhận xét trên OP nó thực sự là lỗi, có một liên kết – aaronman

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