Почему одноименные локальные переменные extern в разных блоках получают разные связи между компиляторами в c ++? - PullRequest
12 голосов
/ 17 апреля 2020

Пока я просто проверял, какие связи предоставлены внешним локальным переменным
Я обнаружил, что между компиляторами

, например, наблюдается другое поведение, если я тестировал приведенный ниже код
, как вы видите в переменной 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 плох, поэтому я могу неправильно
Если у кого-то есть идея, что компиляторы хорошо соответствуют стандарту
и, если возможно, кто-нибудь может объяснить, что стандарт говорит именно для меня?

1 Ответ

4 голосов
/ 25 апреля 2020

Это тема открытого выпуска CWG1839 . Текущее намерение состоит в том, что поведение Clang и MSV C является правильным.

...