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
c++
language-lawyer
c++17
Eddie Kuo
źródło
źródło
MSVC
iclang-cl
(oba dają2
), wydaje się, żeextern 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.Odpowiedzi:
[basic.link/7] powinien być odpowiednią częścią standardu. W bieżącym projekcie mówi:
Zauważ, że kolejny przykład prawie dokładnie pasuje do twojego przypadku:
Tak więc program powinien być źle sformułowany. Wyjaśnienie znajduje się poniżej przykładu:
źródło