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 var
s 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?
f()
chức năng và trong cùngextern void f()
có liên kết nội bộ -var
cũng nên có liên kết nội bộ ở đây, vì nó đề cập đến cùng một "thực thể".