Поки я лише перевіряв, які зв’язки надаються зовнішнім локальним змінним,
я виявив, що між компіляторами поводиться дещо інша поведінка
наприклад, якщо я перевірив код нижче,
як ви бачите в змінній коментарів 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 )
Я боюся, що моя англійська мова погана, тому я не можу зрозуміти її правильно.
Якщо хтось має уявлення про те, які компілятори добре відповідають стандарту,
і якщо можливо, хтось може розробити те, що стандарт говорить саме для мене?
f()
функцією, а найпотаємнішийextern void f()
має внутрішній зв'язок -var
має бути і внутрішній зв'язок тут, оскільки він посилається на ту саму "сутність".