Có hai tệp nguồn trong chương trình của tôi.Tuyên bố không nên khớp với định nghĩa của nó khi mảng được tham gia?
Mảng được xác định trong A.cpp.
// compiler: MSVC2005 SP2
// A.cpp
// defines an array of type "int [100]"
int a[100] = {3};
Được sử dụng trong B.cpp.
// B.cpp
// declares an array of type "int []"
extern int a[];
int main()
{
// prints 3 correctly
cout << a[0] << endl;
return 0;
}
AFAIK, trình liên kết sẽ phát sinh lỗi nếu không tìm thấy định nghĩa phù hợp cho khai báo nếu số nhận dạng được khai báo được sử dụng. Ở đây, int [] và int [100] là hai loại khác nhau, hiển nhiên.
Tại sao, trong trường hợp này, không có bất kỳ lỗi liên kết nào? Được đảm bảo bởi Chuẩn rằng kích thước mảng là không đáng kể trong khi khớp với khai báo/định nghĩa? Hoặc nó chỉ thực hiện cụ thể? Trích dẫn từ Tiêu chuẩn sẽ được đánh giá cao nếu có.
Edit: iammilind đề cập trong câu trả lời của ông rằng mối liên kết có thể chạy một cách chính xác (trình biên dịch của ông là gcc) ngay cả khi loại không phù hợp giữa tuyên bố và định nghĩa. Nó có được yêu cầu bởi tiêu chuẩn hay chỉ là một cách của gcc? Tôi đoán đây là một vấn đề quan trọng hơn rất nhiều để tìm ra.
Lỗi nằm trong "rõ ràng". –
@Alf. Không. Trích dẫn từ tiêu chuẩn 8.3.4 "Loại " chuỗi khai báo-kiểu-danh sách-loại-danh sách của NT "là một kiểu khác với kiểu" khai báo-khai báo-loại-danh sách mảng không xác định ràng buộc của T, " –
@Erik Thay vì đi vào một cuộc thảo luận về những gì mà "rõ ràng" đòi hỏi, mà tất nhiên bạn biết tốt nhất !, Tôi đề nghị bạn chọn câu trả lời của AndreyT như là giải pháp, mặc dù trong quan điểm của tôi sử dụng từ "trận đấu "là một chút sai lầm.Dù sao, lý do mà bạn có thể nhận được những thứ để liên kết nơi các loại không phù hợp với các quy tắc ngôn ngữ cho phù hợp, là trình biên dịch không đi đến rất nhiều nỗ lực để bắt lỗi ở đây. –