2015-04-27 15 views
13
C++

[basic.link]/6Không thể hiểu tuyên bố # 3 trong Ví dụ về [basic.link]/6 14

Tên của một chức năng khai báo trong phạm vi khối và tên của một biến số được khai báo bởi một phạm vi khối extern khai báo có liên kết. Nếu có một tuyên bố có thể hiển thị của một thực thể có liên kết có tên và loại , bỏ qua các thực thể được khai báo bên ngoài phạm vi không gian tên bên trong, khai báo phạm vi khối tuyên bố rằng cùng một thực thể và nhận được liên kết của tuyên bố trước đó . Nếu có nhiều pháp nhân phù hợp, chương trình là không đúng định dạng. Ngược lại, nếu không có thực thể phù hợp được tìm thấy, các đối tượng phạm vi khối nhận liên kết bên ngoài [Ví dụ:.

static void f(); 
static int i = 0; // #1 
void g() { 
    extern void f(); // internal linkage 
    int i; // #2 i has no linkage 
    { 
     extern void f(); // internal linkage 
     extern int i; // #3 external linkage 
    } 
} 

Có ba đối tượng tên là i trong chương trình này. Đối tượng có liên kết nội bộ được giới thiệu bởi khai báo trong phạm vi toàn cầu (dòng # 1), đối tượng có thời lượng lưu trữ tự động và không có liên kết được giới thiệu bởi khai báo trên dòng # 2 và đối tượng có thời lượng lưu trữ tĩnh và liên kết bên ngoài tờ khai trên dòng số 3. Ví dụ -end]

Tôi có hai ý kiến ​​về đoạn này:

  1. Các static int i = 0; khai trong phạm vi toàn cầu là không có thể nhìn thấy bên trong khối chứa khai báo extern int i; (# 3). Do đó, chúng tôi chỉ có thể nói rằng tuyên bố sau này có liên kết bên ngoài, nghĩa là chúng tôi không thể liên kết nó với tuyên bố số 1.
  2. Nếu không, nếu khai báo static int i; được xem là có thể nhìn thấy bằng đoạn văn, đoạn khai báo khối khai báo cùng một thực thể và nhận liên kết của khai báo trước đó, đó là liên kết nội bộ, và không liên kết bên ngoài, như đã nêu trong Ví dụ.

Tôi thiếu gì ở đây?

Trả lời

9

này là tùy thuộc vào active issue 426 mà nói:

Một ví dụ trong 3.5 [basic.link] đoạn 6 tạo ra hai file-phạm vi biến có cùng tên, một với liên kết nội bộ và một với bên ngoài .

static void f(); 
static int i = 0;      //1 
void g() { 
     extern void f();    // internal linkage 
     int i;       //2: i has no linkage 
     { 
       extern void f();  // internal linkage 
       extern int i;   //3: external linkage 
     } 
} 

Đây có thực sự là những gì chúng tôi muốn không? C99 có 6.2.2.7/7, cho biết hành vi không xác định để có số nhận dạng xuất hiện với liên kết nội bộ và bên ngoài trong cùng một đơn vị dịch. C++ dường như không có số tương đương .

Đề xuất ban đầu là để làm cho nó hành vi undefined:

Chúng tôi đồng ý rằng đây là một lỗi.Chúng tôi đề xuất để lại ví dụ nhưng thay đổi nhận xét để cho biết rằng dòng // 3 có hành vi không xác định, và các nơi khác thêm quy tắc quy tắc cho trường hợp như vậy chưa được xác định .

nhưng hai ý kiến ​​cuối cùng nói:

Theo 3,5 [basic.link] đoạn 9, hai biến với liên kết trong ví dụ đề xuất không phải là “cùng một thực thể” bởi vì họ không có cùng một liên kết. Một số công thức khác sẽ cần thiết để mô tả mối quan hệ giữa hai biến đó.

và:

Các CWG quyết định rằng nó sẽ là tốt hơn để thực hiện một chương trình với loại liên kết không phù hợp vô hình thành thay vì phải xác định hành vi.

Nhận xét mới nhất không đề xuất một từ mới và nó chưa được cập nhật từ năm 2006, vì vậy tốt nhất chúng ta có thể nói suy nghĩ hiện tại là điều này không đúng.

Để tham khảo dự thảo tiêu chuẩn C99 6.2.2.7/7 nói:

Nếu, trong một đơn vị dịch thuật, nhận dạng tương tự xuất hiện với cả hai bên trong và bên ngoài liên kết, hành vi này là không xác định.