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
MSVC
i clang-cl
(oba dają 2
), wydaje się, że extern int i
jest on całkowicie ignorowany przez oba: nawet jeśli nie połączę other.cpp
pliku, program się buduje i uruchamia.
i
, nie próbuje.