Пока я просто проверял, какие связи предоставлены внешним локальным переменным
Я обнаружил, что между компиляторами
, например, наблюдается другое поведение, если я тестировал приведенный ниже код
, как вы видите в переменной comments. var
s имеют разные связи
// 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 ++ )
Из результата видно, что если имеется более двух вложенных блоков
g ++ просто предоставляет внешние связи с переменными
Я могу найти соответствующую фразу в стандарте
, но до сих пор неясно, потому что его поведение отличается от компиляторов
(https://eel.is/c++draft/basic.link#6)
Боюсь, что мой Engli sh плох, поэтому я могу неправильно
Если у кого-то есть идея, что компиляторы хорошо соответствуют стандарту
и, если возможно, кто-нибудь может объяснить, что стандарт говорит именно для меня?