このプログラムをg ++とclang ++でコンパイルします。違いがあります:
g ++は1を出力しますが、clang ++は2を出力
します
。g++:extern変数は最も短いスコープで定義されているようです。
clang ++:extern変数は最短のグローバルスコープで定義されます。
C ++仕様にはその仕様がありますか?
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;
バージョン:g ++:7.4.0 / clang ++:10.0.0
コンパイル:$(CXX)main.cpp other.cpp -o extern.exe
MSVC
とclang-cl
(両方ともgive 2
)でコードをいじってみると、両方extern int i
で完全に無視されているようother.cpp
です。ファイルにリンクしなくても、プログラムがビルドされて実行されます。
i
、試行しません。