Farklı bloklardaki aynı adlandırılmış extern yerel değişkenleri neden c ++ 'da derleyiciler arasında farklı bağlantılar elde eder?


12

Yerel değişkenleri dışlamak için hangi bağlantıların verildiğini kontrol ederken,
derleyiciler arasında bazı farklı davranışların olduğunu gördüm.

Örneğin
, yorum değişkeninde gördüğünüz kodun altında test edersem değişkenin varfarklı bağlantıları vardır.

// 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;
        }
    }
}       

sonuç

  • g ++: "100 10 10"
  • clang ++: "100100100" (msvc ++)

Sonuçtan görebiliyorum ki ikiden fazla iç içe blok varsa,
g ++ sadece değişkenlere dış bağlantılar sağlar

Standartta ilgili ifadeyi bulabilirim
ama davranışları derleyiciler tarafından farklı olduğu için hala belirsiz
( https://eel.is/c++draft/basic.link#6 )

İngilizcemin kötü olduğundan korkuyorum, doğru bir şekilde
anlayamıyorum Birisi hangi derleyicilerin standarda iyi uyduğuna dair bir fikre
sahipse ve mümkünse biri standardın tam olarak benim için söylediklerini ayrıntılandırabilir mi?


1
İlgili stackoverflow.com/questions/41978949/… Ben bir gcc hata olduğuna inanıyorum, standart f()işlevi ile örnek verir ve en içteki extern void f()iç bağlantı vardır - varaynı "varlık" anlamına gelir, çünkü burada da iç bağlantı olmalıdır.
KamilCuk

Dış bağlantıya sahip kuruluşların IMO blok kapsamı bildirimleri Kötülük ve dil onları yasaklamaktan daha iyi olurdu
MM

@MM: Modül birimleri bunu yapıyor!
Davis Herring

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.