Ich kompiliere dieses Programm mit g ++ und clang ++. Es gibt einen Unterschied:
g ++ druckt 1, aber clang ++ druckt 2.
Es scheint, dass
g ++: die externe Variable im kürzesten Bereich definiert ist.
clang ++: Die externe Variable wird im kürzesten globalen Bereich definiert.
Hat die C ++ - Spezifikation eine Spezifikation dazu?
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;
version: g ++: 7.4.0 / clang ++: 10.0.0
kompilierung: $ (CXX) main.cpp other.cpp -o extern.exe
c++
language-lawyer
c++17
Eddie Kuo
quelle
quelle
MSVC
undclang-cl
(beide geben2
) herumspielen, scheint dasextern int i
von beiden völlig ignoriert zu werden: Auch wenn ich dieother.cpp
Datei nicht verlinke , wird das Programm erstellt und ausgeführt.i
nicht auflösen muss.Antworten:
[basic.link/7] sollte der relevante Teil des Standards sein. Im aktuellen Entwurf heißt es:
Beachten Sie, dass das folgende Beispiel fast genau Ihrem Fall entspricht:
Das Programm sollte also schlecht gestaltet sein. Die Erklärung befindet sich unter dem Beispiel:
quelle