Чому ж названі зовнішні локальні змінні в різних блоках отримують різні зв’язки між компіляторами в c ++?


12

Поки я лише перевіряв, які зв’язки надаються зовнішнім локальним змінним,
я виявив, що між компіляторами поводиться дещо інша поведінка

наприклад, якщо я перевірив код нижче,
як ви бачите в змінній коментарів vars мають різні зв'язки

// 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 )

Я боюся, що моя англійська мова погана, тому я не можу зрозуміти її правильно.
Якщо хтось має уявлення про те, які компілятори добре відповідають стандарту,
і якщо можливо, хтось може розробити те, що стандарт говорить саме для мене?


1
Пов'язані stackoverflow.com/questions/41978949/… Я вважаю, що це помилка gcc, стандарт наводить приклад із f()функцією, а найпотаємніший extern void f()має внутрішній зв'язок - varмає бути і внутрішній зв'язок тут, оскільки він посилається на ту саму "сутність".
KamilCuk

Блокування декларацій IMO щодо об'єктів із зовнішніми зв'язками - Зло, і мова буде краще, якщо заборонити їх
MM

@MM: Модульні модулі так роблять!
Оселедець Девіса

Відповіді:


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.