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, var
haben 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?
f()
Funktion an und das Innersteextern void f()
hat eine interne Verknüpfung -var
sollte auch hier eine interne Verknüpfung haben, da es sich auf dieselbe "Entität" bezieht.Antworten:
Dies ist das Thema der offenen Ausgabe CWG1839 . Die aktuelle Absicht ist, dass das Verhalten von Clang und MSVC korrekt ist.
quelle