2012-02-23 25 views
0

グローバルがありますint何かの理由で別のファイルに変更したいのですが、動作しません。グローバル変数が機能しない

私が持っている:なぜ、とき

//test.h

#include <windows.h> 

static int start1; //want to use this globally. 

//declare 
void something(); 

//test.cpp

#include "test.h" 

extern int start1; 

void something() 
{ 
    start1 = start1 + 1; 
} 

//main.cpp

#include "test.h" 
#include "stdafx.h" 
#include <iostream> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    start1 = 3; 
    something(); 
    return 0; 
} 

something()に入るのはです0、3の代わりに?私は何時間もグローバル変数を作成しようとしていますが、うまくいきません。誰か明確にすることはできますか?

答えて

10

ヘッダーファイルに変数staticを宣言しないでください。これにより、そのヘッダファイルを含む各翻訳ユニット(すなわち、ソースファイル)に存在する別個の変数が生じる。

標準的なパターンは、ヘッダーファイルに変数をexternとして宣言し、それを1つのソースファイルで「通常」と定義することです。

+0

しかし、test.hとmain.cppは同じ翻訳単位ではありません。 –

+1

@TonyTheLion: 'test.h'は複数のソースファイルに含まれているので、複数の翻訳単位に影響します。 –

3

ヘッダーにintをexternとして宣言する必要があります。 .cppファイルで定義するときに修飾子は必要ありません。静的修飾子は、実際には宣言しているintが現在の変換単位でしかアクセスできないことを意味します。したがって、各.cppファイルは異なるバージョンを取得します。

0

すべてソースファイル

static int start1; 

置く場合は、静的な効果を得ることができます、その中のデータは、それぞれの内の別のアドレスになります。 次に、各ユニットの個別の値/コンテンツを保持することができます。

しかし、これはグローバル変数ではありません。グローバル変数は、ユニット間で共有されるものであり、反対ではありません。だから静的な振る舞いとグローバル(extern)の内容に違いがある...上記の答えは正しかったが、私は議論に少しの視点を加えるかもしれないと思った。

Cで同様の設定を実行しましたが、静的変数は同じように動作します。

関連する問題