Por que as mesmas variáveis ​​locais externas nomeadas em blocos diferentes obtêm vínculos diferentes entre compiladores em c ++?

12

Enquanto eu estava apenas verificando quais vínculos são concedidos a variáveis ​​locais externas,
descobri que algum comportamento diferente entre compiladores

por exemplo, se eu testei abaixo do código,
como você vê nos comentários, a variável vars tem diferentes vínculos

// 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;
        }
    }
}       

o resultado é

  • g ++: "100 10 10"
  • clang ++: "100 100 100" (msvc ++)

Eu posso ver pelo resultado que, se houver mais de dois blocos aninhados, o
g ++ apenas concede vínculos externos a variáveis

Eu poderia encontrar uma frase relacionada no padrão,
mas ainda não está claro porque seu comportamento é diferente pelos compiladores
( https://eel.is/c++draft/basic.link#6 )

Receio que meu inglês seja ruim, por isso não consigo entendê-lo corretamente.
Se alguém tiver uma idéia de quais compiladores estão em conformidade com o padrão
e, se possível, alguém poderia elaborar o que o padrão diz exatamente para mim?

hyuk myeong
fonte
11
Stackoverflow.com/questions/41978949/… relacionado Eu acredito que seja um bug do gcc, o padrão dá o exemplo com a f()função e o mais extern void f()interno tem ligação interna - vardeve ter ligação interna aqui também, porque se refere à mesma "entidade".
KamilCuk 20/04
As declarações de escopo de bloco da IMO de entidades com vínculo externo são ruins e o idioma seria melhor se as banisse
MM
@MM: as unidades do módulo fazem isso!
Davis Herring

Respostas:

4

Esse é o assunto da edição aberta CWG1839 . A intenção atual é que o comportamento de Clang e MSVC esteja correto.

Davis Herring
fonte