Compilo este programa por g ++ y clang ++. Hay una diferencia:
g ++ imprime 1, pero clang ++ imprime 2.
Parece que
g ++: la variable externa se define en el ámbito más corto.
clang ++: la variable externa se define en el ámbito global más corto.
¿La especificación C ++ tiene alguna especificación al respecto?
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;
versión: g ++: 7.4.0 / clang ++:
compilación 10.0.0 : $ (CXX) main.cpp other.cpp -o extern.exe
c++
language-lawyer
c++17
eddie kuo
fuente
fuente
MSVC
yclang-cl
(ambos dan2
), parece queextern int i
ambos lo ignoran por completo: incluso si no enlace en elother.cpp
archivo, el programa se construye y se ejecuta.i
, no lo intenta.Respuestas:
[basic.link/7] debería ser la parte relevante de la Norma. En el borrador actual, dice:
Tenga en cuenta que el siguiente ejemplo coincide casi exactamente con su caso:
Entonces, el programa debe estar mal formado. La explicación está debajo del ejemplo:
fuente