Tại sao cùng một biến cục bộ extern trong các khối khác nhau có được mối liên kết khác nhau giữa các trình biên dịch trong c ++?


12

Trong khi tôi chỉ kiểm tra các liên kết nào được cấp cho các biến cục bộ bên ngoài,
tôi thấy rằng một số hành vi khác nhau giữa các trình biên dịch

ví dụ nếu tôi đã kiểm tra mã bên dưới
như bạn thấy trong các biến nhận xét vars có các liên kết khác nhau

// foo.cpp
int var = 10;                // external linkage

// main.cpp
#include <iostream>

static int var = 100;        // internal linkage

int main() {
    extern int var;          // internal linkage
    std::cout << var << std::endl;
    {
        extern int var;      // g++: external linkage , clang++: internal linkage
        std::cout << var << std::endl;
        {
            extern int var;  // g++: external linkage , clang++: internal linkage
            std::cout << var << std::endl;
        }
    }
}       

kết quả là

  • g ++: "100 10 10"
  • kêu vang ++: "100 100 100" (msvc ++)

Tôi có thể thấy từ kết quả rằng nếu có nhiều hơn hai khối lồng nhau thì
g ++ chỉ cấp các liên kết ngoài cho các biến

Tôi có thể tìm thấy cụm từ liên quan trong tiêu chuẩn
nhưng vẫn chưa rõ ràng vì hành vi của nó khác với trình biên dịch
( https://eel.is/c++draft/basic.link#6 )

Tôi sợ rằng tiếng Anh của tôi kém nên tôi không thể hiểu chính xác
Nếu ai đó có ý tưởng rằng trình biên dịch nào tuân thủ tốt tiêu chuẩn
và nếu có thể ai đó có thể giải thích chính xác những gì tiêu chuẩn nói với tôi?


1
Liên kết stackoverflow.com/questions/41978949/ Từ Tôi tin rằng đó là một lỗi gcc, tiêu chuẩn đưa ra ví dụ với f()chức năng và trong cùng extern void f()có liên kết nội bộ - varcũng nên có liên kết nội bộ ở đây, vì nó đề cập đến cùng một "thực thể".
KamilCuk

Khai báo phạm vi khối IMO của các thực thể có liên kết bên ngoài là Ác và ngôn ngữ sẽ tốt hơn khi cấm chúng
MM

@MM: Các đơn vị mô-đun làm như vậy!
Davis Herring

Câu trả lời:


4

Đây là chủ đề của vấn đề mở CWG1839 . Mục đích hiện tại là hành vi của Clang và MSVC là chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.