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 var
s 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?
f()
função e o maisextern void f()
interno tem ligação interna -var
deve ter ligação interna aqui também, porque se refere à mesma "entidade".Respostas:
Esse é o assunto da edição aberta CWG1839 . A intenção atual é que o comportamento de Clang e MSVC esteja correto.
fonte