異なるブロックの同じ名前のexternローカル変数が、c ++のコンパイラー間で異なるリンケージを取得するのはなぜですか?


12

externローカル変数
にどのリンケージが許可されているかを確認しているだけですが、コンパイラ間でいくつかの異なる動作があることがわかりました

たとえば
、コメント変数で見られるように、以下のコードをテストした場合、変数varのリンケージは異なります

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

結果は

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

結果から、ネストされたブロックが3つ以上ある場合、
g ++は変数への外部リンケージを付与するだけであることがわかります

標準で関連するフレーズを見つけることができました
が、コンパイラによって動作が異なるため、依然として不明です
https://eel.is/c++draft/basic.link#6

英語が下手なため、正しく
理解できないのではない
でしょうか。どのコンパイラが標準によく準拠していて、可能であれば、標準が私に正確に言っていることを誰かが詳しく説明できる人がいる場合はどうすればよいですか。


1
関連するstackoverflow.com/questions/41978949/…私はそれがgccのバグだと思います、標準はf()機能を備えた例を示し、最も内側extern void f()に内部リンケージがあります- var同じ「エンティティ」を参照するため、ここにも内部リンケージがあるはずです
KamilCuk

外部リンケージを持つエンティティのIMOブロックスコープ宣言は悪であり、言語はそれらを禁止する方がよいでしょう
MM

@MM:モジュールユニットはそうします!
Davis Herring

回答:


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.