Пока я только проверял, какие связи предоставляются внешним локальным переменным,
я обнаружил, что некоторые компиляторы ведут себя по- разному.
например, если я тестировал приведенный ниже код,
как вы видите в комментариях, переменные 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;
}
}
}
результат
- г ++: "100 10 10"
- clang ++: "100 100 100" (msvc ++)
Из результата видно, что если имеется более двух вложенных блоков,
g ++ просто предоставляет внешние связи с переменными.
Я мог бы найти связанную фразу в стандарте,
но это все еще неясно, потому что ее поведение отличается от компиляторов
( https://eel.is/c++draft/basic.link#6 )
Я боюсь, что мой английский плохой, поэтому я не могу понять его правильно.
Если у кого-то есть идея, какие компиляторы хорошо соответствуют стандарту,
и, если возможно, кто-нибудь может объяснить, что стандарт говорит именно для меня?
f()
функцией, а внутренняяextern void f()
имеет внутреннюю связь -var
здесь тоже должна быть внутренняя связь, поскольку она ссылается на одну и ту же "сущность".