Warum erhalten gleichnamige externe lokale Variablen in verschiedenen Blöcken unterschiedliche Verknüpfungen zwischen Compilern in C ++?

12

Während ich nur überprüfte, welche Verknüpfungen externen lokalen Variablen gewährt werden, stellte
ich fest, dass sich Compiler unterschiedlich verhalten

Wenn ich zum Beispiel den folgenden Code getestet habe,
wie Sie in den Kommentaren sehen, varhaben die Variablen unterschiedliche Verknüpfungen

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

Das Ergebnis ist

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

Ich kann dem Ergebnis entnehmen, dass
g ++ bei mehr als zwei verschachtelten Blöcken nur externe Verknüpfungen zu Variablen gewährt

Ich konnte verwandte Ausdrücke im Standard finden,
aber es ist immer noch unklar, da sich Compiler anders verhalten
( https://eel.is/c++draft/basic.link#6 ).

Ich befürchte, dass mein Englisch schlecht ist und ich es nicht richtig verstehen kann.
Wenn jemand eine Idee hat, welche Compiler dem Standard gut entsprechen,
und wenn möglich, könnte jemand näher erläutern, was der Standard genau für mich sagt?

Hyuk Myeong
quelle
1
Verwandte stackoverflow.com/questions/41978949/… Ich glaube, es ist ein gcc-Fehler, Standard gibt das Beispiel mit f()Funktion an und das Innerste extern void f()hat eine interne Verknüpfung - varsollte auch hier eine interne Verknüpfung haben, da es sich auf dieselbe "Entität" bezieht.
KamilCuk
IMO-Blockumfangserklärungen von Entitäten mit externer Verknüpfung sind böse und die Sprache wäre besser dran, wenn sie verboten würden
MM
@MM: Moduleinheiten tun dies!
Davis Herring

Antworten:

4

Dies ist das Thema der offenen Ausgabe CWG1839 . Die aktuelle Absicht ist, dass das Verhalten von Clang und MSVC korrekt ist.

Davis Herring
quelle