Kompiluję ten program przez g ++ i clang ++. Jest różnica:
g ++ drukuje 1, ale clang ++ drukuje 2.
Wygląda na to, że
g ++: zmienna zewnętrzna jest zdefiniowana w najkrótszym zakresie.
clang ++: zmienna zewnętrzna jest zdefiniowana w najkrótszym globalnym zakresie.
Czy specyfikacja C ++ ma jakieś specyfikacje na ten temat?
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;
wersja: g ++: 7.4.0 / clang ++: 10.0.0
kompilacja: $ (CXX) main.cpp other.cpp -o extern.exe
MSVCi clang-cl(oba dają 2), wydaje się, że extern int ijest on całkowicie ignorowany przez oba: nawet jeśli nie połączę other.cpppliku, program się buduje i uruchamia.
i, nie próbuje.