Eu compilo este programa por g ++ e clang ++. Há uma diferença:
g ++ imprime 1, mas clang ++ imprime 2.
Parece que
g ++: a variável externa é definida no escopo mais curto.
clang ++: a variável externa é definida no menor escopo global.
A especificação C ++ tem alguma especificação sobre isso?
main.cpp
#include <iostream>
static int i;
static int *p = &i;
int main() {
int i;
{
extern int i;
i = 1;
*p = 2;
std::cout << i << std::endl;
}
}
other.cpp
int i;
versão: g ++: 7.4.0 / clang ++: 10.0.0
compilação: $ (CXX) main.cpp other.cpp -o extern.exe
c++
language-lawyer
c++17
eddie kuo
fonte
fonte
MSVC
eclang-cl
(ambos dão2
), parece que eleextern int i
é completamente ignorado por ambos: mesmo que eu não vincule oother.cpp
arquivo, o programa cria e executa.i
, ele não tenta.Respostas:
[basic.link/7] deve ser a parte relevante da Norma. No rascunho atual, ele diz:
Observe que o exemplo subsequente corresponde quase exatamente ao seu caso:
Portanto, o programa deve estar mal formado. A explicação está abaixo do exemplo:
fonte