Mengapa variabel lokal extern bernama sama di blok yang berbeda mendapatkan hubungan yang berbeda antara kompiler di c ++?


12

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 vars 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?


1
Terkait stackoverflow.com/questions/41978949/... Saya percaya ini adalah bug gcc, standar memberikan contoh dengan f()fungsi dan yang paling dalam extern void f()memiliki hubungan internal - varharus memiliki hubungan internal di sini juga, karena mengacu pada "entitas" yang sama.
KamilCuk

Deklarasi cakupan IMO blok entitas dengan tautan eksternal adalah Jahat dan bahasa akan lebih baik dengan melarang mereka
MM

@ MM: Unit modul melakukannya!
Davis Herring

Jawaban:


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.