Mentre stavo solo controllando quali collegamenti sono concessi alle variabili locali esterne,
ho scoperto che alcuni comportamenti diversi tra compilatori
per esempio se ho testato sotto il codice
come vedi nella variabile commenti var
s hanno collegamenti diversi
// 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;
}
}
}
il risultato è
- g ++: "100 10 10"
- clang ++: "100 100 100" (msvc ++)
Dal risultato posso vedere che se ci sono più di due blocchi nidificati,
g ++ garantisce solo collegamenti esterni alle variabili
Potrei trovare una frase correlata nello standard
ma non è ancora chiaro perché il suo comportamento è diverso dai compilatori
( https://eel.is/c++draft/basic.link#6 )
Temo che il mio inglese sia pessimo, quindi non riesco a capirlo correttamente
Se qualcuno ha idea di quali compilatori stiano conformando bene lo standard
e, se possibile, qualcuno potrebbe elaborare ciò che lo standard dice esattamente per me?
f()
funzione e il più internoextern void f()
ha un collegamento interno -var
dovrebbe avere anche un collegamento interno qui, perché si riferisce alla stessa "entità".