¿Por qué las mismas variables externas externas con el mismo nombre en diferentes bloques obtienen diferentes enlaces entre los compiladores en c ++?

12

Mientras estaba comprobando qué enlaces se otorgan a variables locales externas
, encontré que hay un comportamiento diferente entre los compiladores

por ejemplo, si probé el código a continuación,
como puede ver en los comentarios, las variables vartienen enlaces diferentes

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

el resultado es

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

Puedo ver por el resultado que si hay más de dos bloques anidados,
g ++ solo otorga enlaces externos a las variables

Podría encontrar una frase relacionada en el estándar,
pero aún no está claro porque su comportamiento es diferente según los compiladores
( https://eel.is/c++draft/basic.link#6 )

Me temo que mi inglés es malo, así que no puedo entenderlo correctamente.
Si alguien tiene una idea de qué compiladores están cumpliendo bien con el estándar
y, si es posible, ¿podría alguien explicar lo que el estándar dice exactamente para mí?

hyuk myeong
fuente
1
Stackoverflow.com/questions/41978949/… relacionado Creo que es un error de gcc, el estándar da el ejemplo con la f()función y el más extern void f()interno tiene un enlace interno, también vardebería tener un enlace interno aquí, porque se refiere a la misma "entidad".
KamilCuk
Las declaraciones de alcance de bloque de la OMI de entidades con vinculación externa son malas y el lenguaje estaría mejor prohibiéndolas
MM
@MM: ¡Las unidades de módulo lo hacen!
Davis Herring

Respuestas:

4

Este es el tema de la edición abierta CWG1839 . La intención actual es que el comportamiento de Clang y MSVC sea correcto.

Arenque Davis
fuente