17

C++ 名前空間を使用する場合、次のように明示的に名前を付けることを好みますか?

std::cout << "Hello, world!\n";

それとも好きですかusing namespace

using namespace std;
cout << "Hello, world!\n";

後者を好む場合は、ファイルまたは関数スコープで usings を宣言しますか?

std個人的には、それらに明示的に名前を付ける方が好きです。入力するのはより簡単ですが、名前空間 (と など) を組み合わせて使用​​すると、boostより読みやすくなります。

4

8 に答える 8

20

私は常に明示的なものを使用します。std を書いても害はなく、どこから来たのかがはっきりとわかります。独自の「文字列」、「ベクトル」などを維持するためのレガシープロジェクトがある場合に便利です。コードに含まれる情報が多ければ多いほど、より良い結果が得られます。

于 2008-10-18T11:39:13.340 に答える
20

余分な入力はここでは問題ではありません。明示的に修飾された名前の問題は、見た目が煩雑になることです。正直に言うと、C++ の構文は乱雑です。不必要に名前を長くしたり、コードに::s をふんだんに散りばめたりして、これを悪化させる必要はありません。

私は Jeff Atwood と一緒です: The Best Code is No Code At All . 信用できる。

名前空間のインポートは、混乱を減らす優れた方法であり、欠点はありません。開いている名前空間のスコープが単一のコンパイル単位に縮小されている限り1、名前の競合が発生した場合でも、簡単に解決できます。

なぜ明示的な名前を (一般的に) 読みやすくする必要があるのか​​は、私にとって常に謎でした。読者は一般的に、セマンティクスを推測できるだけの十分なコードを知っている必要があります。そうでない場合は、とにかくコードを修正する必要があります。


1)結果:usingヘッダーにはありません!

于 2008-10-18T12:07:24.720 に答える
17

私はいつもusing namespacestd&boostに使っています。それ以外の場合は、明示的な名前空間を使用する傾向がありますが、それがコードを混乱させるほど頻繁に使用される場合を除きます。

using namespaceヘッダーでは、#include ソースのグローバル名前空間の汚染を避けるために決して使用しません。

于 2008-10-18T11:35:34.083 に答える
4

usingコードをusing namespaceより読みやすくするのに非常に便利です - 混乱を取り除きます。

ただし、シンボルがどこから来たのかを見つけるのが難しくなる場合は、名前空間全体をインポートすることを拒否します.

インポートされた名前空間の範囲を制限しようとしています:

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

のような「一般的に知られている」ライブラリについてはstd、あえて を使用しusing namespace stdます。このコードを読んでいるすべての人がこれらのシンボルを知っていると信じる理由があります。

補足として、このusingキーワードは、派生クラスがそのスーパークラスのオーバーロードされたメンバーもエクスポートすることを示すためにも使用されます。

class A {
  void f( A  );
  void f( bool );
};

class B : public A {
  using A::f; // without this, we get a compilation error in foo()
  void f(bool);
};

void foo() {
  B b;
  b.f( A() ); // here's a compilation error when no `using` is used in B
}
于 2008-10-18T15:05:03.923 に答える
4

私の一般的なルールは、常にヘッダーで名前空間を明示的に使用し、通常はコードで using を使用することです。前者の理由は、定義のあらゆる部分で何が使用されているかを明確にするためであり、後者の理由は、必要に応じて別の名前空間からの置換を簡単に使用できるようにするためです。つまり、std::string の代わりに foo::string の使用を開始したい場合、コード内の std::string のすべてのインスタンスを foo::string に置き換えるのではなく、ヘッダーと using ステートメントを更新するだけで済みます。

もちろん、これは std:: 名前空間に存在するクラスにはあまり役に立ちません。1 つのクラスを置き換えても、std で他のクラスを使用する可能性が高く、あいまいさの問題が発生する可能性があるためですが、これは単なる例です。

于 2008-10-18T12:05:13.197 に答える
2

using関数スコープで、または関数が非常に小さい場合(多くの場合)、明示的な名前空間のみ

于 2008-10-18T13:09:49.103 に答える
2

あいまいさがある場合にのみ、明示的な名前空間を使用します。より読みやすくなりますが、追加の入力は面倒であり、他の開発者が標準ライブラリについて基本レベルの知識を持っていると想定する必要があります。

私が名前空間を詳しく説明するのは、簡単なデバッグ ステートメントを追加する場合や、非標準のライブラリを使用する場合など、名前空間を 1 回か 2 回しか使用しない場合だけです。

私は通常、名前空間をファイル スコープで宣言しますが、名前空間を混在させる場合は、関数スコープで使用されるポイントの近くに宣言を配置するのが理にかなっている場合があります。

于 2008-10-18T11:37:51.567 に答える
2

.cpp ファイルの先頭に必要な名前を明示的にインポートする傾向があるので...

std::cout; の使用 std::endl の使用;

等...

そうすれば、使用する名前を制御でき、名前の由来を簡単に確認でき、使用時にコードが乱雑になることはありません。

まれに、異なる名前空間の 2 つの名前を使用している場合、使用時にそれらを完全に修飾します。

私は常にヘッダーで完全修飾名を使用し、どこでも「using namespace x」を使用することはほとんどありません...

于 2008-10-18T18:23:29.140 に答える