0

名前空間の変数のライフサイクルについて誰か説明してもらえますか? 次のファイルがあるとします。

ファイル.h:

// ...
namespace variables{
    int x, y;
}

ファイル.cpp:

#include "file.h"
using namespace variables;

int main(){
    ...
}

xとのスコープは何yですか? 私が読んでいた本 (C++ Primer Plus) で、著者は関数内で s を推奨していたので、それらはコマンドusing namespaceの時点で定義されていると思ったからです。usingただし、これを行うと:

Bh:

class B{
     // class stuff
};

namespace variables{
    int x, y;
}

次に、main.cpp(メイン プログラム) とB.cpp(クラスの実装) に次の行を追加します。どのファイルにもありませんが、and#include "B.h"の複数の定義があるというエラーが表示されます。どうしたんだ?2 つの異なる概念を混同していませんか?variables::xvariables::yusing

4

3 に答える 3

4

変数を名前空間で直接宣言した場合、それらは単純にグローバル変数として存在します。

したがって、通常のグローバル変数に適用される規則は、これらの変数にも適用されます。それらは、プログラムが実行されている限り存在し続けるため、ヘッダー ファイルで定義しないでください。

include.h

namespace Variables
{
    extern int x;
    extern int y;
}

ファイル.cpp

namespace Variables
{
    int x;
    int y;
}

書くと、それらの変数に接頭辞を付けなくても、名前とでusing namespace Variablesそれらの変数にアクセスできるようになります。xyVariables::

于 2013-03-29T05:00:40.917 に答える
2

名前空間は変数の寿命に影響を与えないため、次のようになります。

namespace variables{
    int x, y;
}

#include "file.h"
using namespace variables;

int main(){
    ...
}

x と y のスコープは?

これらの変数はグローバルであるため、その寿命はアプリケーション全体の寿命と同じです。

これは、この名前空間の要素の前using namespaceに書き込むためのショートカットに過ぎないことを覚えておいてください。NamespaceName::

于 2013-03-29T04:58:51.147 に答える
2

#include "Bh" 行を追加すると、変数::x と変数::y の複数の定義があるというエラーが表示されますが、どのファイルにも使用がありません。どうしたんだ?2 つの異なる概念を混同していませんか?

名前空間を明示的にインポートしなくても、変数は宣言されます。キーワードは、現在のスコープ内の名前空間または特定の名前をインポートするため、定義された要素にアクセスするusingために先頭に追加する必要はありません。X::

変数の寿命は名前空間の影響を受けません。

于 2013-03-29T05:02:00.893 に答える