3

ここで名前空間について読みましたが、これに対する答えが見つかりませんでした..

例えば:

// example1.cpp
#include "example1.h"
#include <set>

namespace MyNamespace
{
    using std::set;

    void f() {};
}



// example2.cpp
#include "example2.h"
#include <set>

using std::set;

namespace MyNamespace
{
    void f() {};
}

上記の両方の例は、いくつかの x? 内にあります。2 番目の例の方が優れていると感じていますが、他の翻訳単位でnamespace MyNamespace インポートされた名前が表示されないため、その理由がわかりません。では、 Mynamespace の外部と内部のどちらでstd::set呼び出すかを気にする必要はありません。using std::set

説明できますか?また、どの時点std::setでにインポートされMynamespaceますか? どうやってそれを知ることができますか?

編集:

上記の例は同じプロジェクトの cpp ファイルであると仮定します。MyNamespace の内部または外部に std::set をインポートすること同等です。他の cpp ファイル (同じ名前空間にある) には名前セットが表示されないためです (たとえあなたが入力しても名前空間 MyNamespace を使用しても効果はありませんset を使用する場合は、各翻訳単位で std::set を使用して入力する必要があります。#include<set>

4

3 に答える 3

3

C++ よりも覚えておいてください。異なるソース ファイルは、通常、異なるTranslation Unitsを生成します。

非公式には、翻訳単位-Eはファイルを含めた結果であり、 (gcc と clangを使用して) 前処理された出力をダンプすることで観察できます。

現在、翻訳単位はコンパイル段階で互いに独立しています。したがって、それらのいずれかで何をしても、他のものにはまったく影響しません。usingこれは明らかにディレクティブにも当てはまります。

もちろん、共有に役立つヘッダーファイルもあります。

明確にするために:

// foo.hpp
#include <set>

namespace Foo { using std::set; }

// foo.cpp
#include "foo.hpp"

namespace Foo {
    using std::swap;

    // both set and swap are accessible without further qualification
}

// bar.cpp
#include "foo.hpp"

namespace Foo {

    // set is accessible without further qualification, swap is not.

}

グローバル名前空間に名前を導入することは避けたほうがよいことに注意してください。新しい型、関数、またはディレクティブtypedefを介してかどうか。usingこのようにして、競合を回避します:)

于 2012-04-25T09:27:34.457 に答える
1

最初にシンボル名をwhile にstd::setのみ インポートし、次にそれを using 宣言が記述されている現在の名前空間にインポートします (これは、表示されている例ではたまたまグローバル スコープになります)。 Mynamespace

シンボル名は、それが書き込まれた現在の名前空間にのみインポートされ、他のスコープでは表示されないため、using ディレクティブをどこに書き込むかについて悩む必要があります。

質問の部分がわかりません。どの時点std::setでインポートされますか。これは、正確には何に関連するポイントですか?

于 2012-04-25T07:43:41.680 に答える
0

最初の例では、std::set のオブジェクト、クラス、およびメソッドは、名前空間 (MyNamespace) 内で明示的にアクセスできます。

一方、2番目の例では、 std::set のオブジェクト、クラス、およびメソッドは、どこでも (MyNamespace 内外で) 明示的に使用できます。

疑似コードでの例 (LITERALLY を使用しないでください)

//exmaple1.cpp
//includes here

using namespace std;

namespace MyNamespace {
  //an example using cout
  //you can call cout here explicitly, like this
  cout << "Some text to print to screen << endl;
}

namespace MyOtherNamespace
{
  //an example using cout
  //you can still call cout here explicitly, like this
  cout << "Some text to print to screen << endl;
}

//example2.cpp
//includes here

namespace MyNamespace {
  using namespace std;
  //an example using cout
  //you can call cout here explicitly, like this
  cout << "Some text to print to screen << endl;
}

namespace MyOtherNamespace
{
  //an example using cout
  //you can't call cout here explicitly, because it has only
  //been defined in MyNamespace
  std::cout << "Some text to print to screen << std::endl;
}

それが役立つことを願っています

于 2012-04-25T07:46:36.957 に答える