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 var
tienen 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í?
f()
función y el másextern void f()
interno tiene un enlace interno, tambiénvar
debería tener un enlace interno aquí, porque se refiere a la misma "entidad".Respuestas:
Este es el tema de la edición abierta CWG1839 . La intención actual es que el comportamiento de Clang y MSVC sea correcto.
fuente