Sementara saya hanya memeriksa hubungan mana yang diberikan kepada variabel lokal extern
saya menemukan bahwa beberapa perilaku yang berbeda antara kompiler
misalnya jika saya menguji kode di bawah ini
seperti yang Anda lihat di variabel komentar var
s memiliki hubungan yang berbeda
// 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;
}
}
}
hasilnya adalah
- g ++: "100 10 10"
- dentang ++: "100 100 100" (msvc ++)
Saya dapat melihat dari hasil bahwa jika ada lebih dari dua blok bersarang
g ++ hanya memberikan hubungan eksternal ke variabel
Saya dapat menemukan frasa terkait dalam standar
tetapi masih belum jelas karena perilakunya berbeda oleh kompiler
( https://eel.is/c++draft/basic.link#6 )
Saya takut bahasa Inggris saya buruk sehingga saya tidak bisa mengerti dengan benar.
Jika seseorang memiliki gagasan bahwa penyusun mana yang memenuhi standar dengan baik
dan jika mungkin, bisakah seseorang menguraikan apa yang dikatakan oleh standar itu pada saya?
f()
fungsi dan yang paling dalamextern void f()
memiliki hubungan internal -var
harus memiliki hubungan internal di sini juga, karena mengacu pada "entitas" yang sama.Jawaban:
Ini adalah subjek masalah terbuka CWG1839 . Maksud saat ini adalah bahwa perilaku Dentang dan MSVC benar.
sumber