[セットトップ]CとC++変数宣言の違いと矛盾した現象について


何も言わないで、まずコードを貼って、VS 2010の中で以下のコードを入力します(MAC Bookは電気が切れました(電源は探したくなくて、MAC OS XCodeの中でテストすることができません))
//A.c file
int	iValue;
//B.c file
int	iValue;
//main.c file
#include <stdio.h>
extern int	iValue;
int main(){
    printf("%d
", iValue); }

C言語には以下の基準がある.
1つの変数が周辺で宣言されたときに初期化されていない場合、この変数は定義できません.例えば、int iValue;このコードは定義ではなく、宣言のみです.
C規格によると、以上のA.cとB.cのiValueは宣言しか計算できないので、このプログラムはリンク時にエラー(iValueの定義が見つからない)を報告するはずですが、VSでテストした結果、プログラムの実行に成功し、出力された結果は0です.
C言語の初期化されていない変数宣言が定義できないのに対して、C++はそれと同じように扱われず、C++は以下のように規定されている.
1、初期化を行う変数は定義です.例えばint iValue=0;またはextern int iValue=0;これはiValueの定義(初期化あり)でも構いません.
2,初期化されていない変数であり,externキーワードが前にない変数も定義される.例えばint iValue;iValueの定義にしても、extern int iValueは宣言(externキーワードあり)としかなりません.
Cと合わない理由:
この基準がCと一致しないのは、class CT objectのようなデフォルトの構造関数があるため、objectの声明とは言えないに違いありません.
 
また、C++でコンパイルすると、VS 2010はまたC++の基準に合致します.
コードは次のとおりです.
//A.cpp file
int	iValue;
//B.cpp file
int	iValue;
//main.cpp file
#include <stdio.h>
extern int	iValue;
int	main(){
	printf("%d
", iValue); }

 
このコードはリンクに失敗するに違いない.C++の基準に基づいて、A.cppとB.cppのiValueが定義されているので、リンクするときは自然に再定義エラーが報告されます.
 
質問:
上記の問題について、VSはなぜC言語の基準に合わないのか.