-2

でoccuringは名前の衝突ではありません。はなぜ構造体を作成した構造体宣言

その後int型の主に私が書く:

number_struct struct_a = { 0 }; 
number_struct struct_b = { 0 }; 

混乱が、私は二回struct_aを宣言しておりますので、私はそれが名前の衝突別名、2回宣言されていることを言って、視覚スタジオからのメッセージを期待するだろうということです。なぜこれは起こりませんか? struct_bを2回宣言しても、メインルーチン内で宣言すると発生します。このほかに

は、私は構造体を初期化せずに次の手順を実行している場合:

std::cout << struct_a.i << "\t" << struct_b.i << std::endl; 
std::cout << struct_a.f << "\t" << struct_b.f << std::endl; 

私はsturctは、初期化せずに使用されていることを言ってランタイムエラーを取得します。コンパイラが構造体(および標準型変数)を自動的に0に初期化しないのはなぜですか?

+0

修正しました、int main(void)です。小さなC++プログラム。 – quantum231

+1

これ以外にも:1つにつき1つ質問してください。 –

+0

ここでは2つの異なる質問があるようです:なぜstruct_aを使用しても名前空間の衝突が2回起こらないのですが、なぜコンパイラが0を初期値として自動的に作成しないのでしょうか?明確にしていただけますか? –

答えて

0
struct number_struct { 
    int i; 
    float f; 
} struct_a; 

は、number_structのインスタンスをグローバルスコープに作成します。 number_structのインスタンスをmainに作成すると、グローバルスコープで作成されたインスタンスが非表示になります。グローバルスコープ内のインスタンスにアクセスするには、スコープ解決演算子::struct_aを使用します。

ランタイムエラーに関しては、どのバージョンをコンパイルしていますか?標準では、グローバル変数を0に初期化するように指示しています(明示的に自分自身を初期化してはいけません)。

+0

私がstatic int iをタイプすると;次に、cout << i;を実行します。できます。しかし、単にint iとcout << iを使うと、私は初期化されていないというランタイムエラーが発生します。 int i(0)を実行すると動作します。 cout << i。 – quantum231

+0

私はVisual Studio 2013バージョン12.0.31101.00 update 4を使用しています。 – quantum231

+0

gccでコンパイルを試しましたか?そうでない場合は、v14(https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx)にアップグレードすることをお勧めします。無料です。私がこれを言う唯一の理由は、しばらくの間、マイクロソフトのコンパイラが最善を尽くすことではなかったからです。 – Max