2009-07-12 8 views
7

私のC++コードでは、宣言using namespace std;またはusing namespace boost;を使用しません。これは私のコードを長くし、よりタイピングを意味します。私は "using"宣言を使い始めることを考えていましたが、それに対して反対する人々もいます。推奨される方法は何ですか? stdとboostはそれほど大きな害はないはずです。どこでstd ::とboost :: prefixesを使うべきですか?

答えて

16

私はusing namespaceをヘッダーではなくC++ファイルでのみ使用します。また、ほとんどの場合、必要でない穴名前空間を使用します。たとえば、またはusing std::tr1::shared_ptrと書くと、shared_ptrの実装を簡単に切り替えることができます。

サンプル:

#include <iostream> 

using std::cout; 

int main() 
{ 
    cout << "test" << std::endl; 
    return 0; 
} 
+0

私はそれについて知らなかった - これは私の問題を解決する。 –

+0

いいえ、残念なことに - それはありません:(g ++はサポートしていません –

+0

それを聞くのは奇妙です。 tは標準です。 –

15

Using namespace ...は面白かったです。

あなたがそれを使う正当な理由があれば、そうしてください(そして、これらの名前空間からのものを頻繁に使用するのが正当な理由です)。あいまいな理由で自分がしたくないことを自分に伝える狂信者の話を聞かないでください。

しかし、これらの点での推論のための良いソースは、C++よくある質問liteのである: http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5

私はそれを読んで、まだあなたがしたいようにそれを使用することを決定しました。

+0

FAQへのリンクは+1です。個人的には 'std ::'プレフィックスを書いています。退屈さが高すぎる場合(すなわち、 'boost :: filesystem'名前空間)、私は' namespace'を使用しますが、関数定義の中でのみファイルスコープには書きません。 – avakar

+13

もっと長い名前空間については、 'namespace fs = boost :: filesystem'を使うことができます。後で' boost :: filesystem :: path'を 'fs :: path'とタイプして参照してください。 – dalle

4

コードを読むとき、コードが:: std :: prefixesで混乱しているということは、本当に面倒です。しかし、シンボルができるだけ簡単にどのような名前空間になっているのかを知りたければ...

これはIDEの仕事ではありませんか?

私のIDEが 'view short typenames'をサポートしていない限り、私はusingという一般的なシンボル(STL、boostなど)の宣言に傾いています。最初の可読性!

+0

名前空間を削除すると読みやすさが向上しますか?私はちょうど情報を失うと思う... – GManNickG

+7

英語:英語:あなた英語:繰り返し英語:英語:事英語:すべて英語:英語:時間英語:それは英語:ちょうど英語:英語になります。 – dave4420

+2

それはただのばかです。 – GManNickG

6

私の独自のルールは以下のとおりです。ヘッダファイル内

  • 、すべての名前が明示的に、例えば修飾されていますstd::stringstd::coutなどをソースファイルに使用する場合は、ファイルの先頭によく使用される名前の句を使用してください。 std::string;
  • using namespace xxxx;を生産コードに使用しないでください。
4

stdという名前空間は、名前を短くするために名前が付けられています。接頭辞std::はわずか5文字で、ほとんど世界の終わりです。これは、System.Collections.Genericのような.NETの名前空間とは異なります。入力が容易になるように設計されています。

そのため、通常は接頭辞stdを入力します。ブーストもあまりにも悪くないので、私は通常それもタイプします。 typedefを使用して短い何か(例えばnamespace fs = boost::filesystem

にサブ名前空間(例えばboost::filesystem)別名通常

私は自由にあまりにも役立ちます。 タイプを頻繁に参照する必要がある場合は、usingを追加するだけです。

しかし、私は一般的にヘッダーにはusingを避けようとしています。私はそれらを使用するときに実際の名前空間を汚染しないように関数スコープに置くことを好みます。

C++には、グローバル名前空間を汚染することなく、名前空間の指定を避けるためのツールが多数用意されています。

+1

これはちょうど5文字ですが、次のようになります:boost :: shared_ptr >> payment_periods; –

+4

私はその場合にtypedefを使用します typedef std :: pair period; typedef std :: vector ピリオド; boost :: shared_ptr payment_periods; –

1

ヘッダーファイルでは、はい。これは、 "std :: name_of_std_memberを使用する"を使用するためです。または「using namespace std;」を使用します。そのヘッダーファイルを含む他のすべてのファイルにグローバルスコープのシンボルが表示され、名前空間の目的が破られます。しかし、ソースファイルでは、 "using namespace std;"を使用しても問題ありません。その名前空間のシンボルを "std ::"という接頭辞で利用できるようにします。

0

私はusing namespaceを機能体内でのみ使用します。ヘッダーファイルでは、私は常に名前空間を明示的に修飾します。

(モックアップのために同僚のコードをコピーするときはめったにありません)、私はusing namespaceを名前空間の範囲(つまり、翻訳単位全体)で使用します。

関連する問題