Почему одноименные локальные переменные extern в разных блоках получают разные связи между компиляторами в 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;
        }
    }
}       

результат

  • г ++: "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: модули делают это!
Дэвис Херринг

Ответы:


4

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.