私のC++コードでは、宣言using namespace std;
またはusing namespace boost;
を使用しません。これは私のコードを長くし、よりタイピングを意味します。私は "using"宣言を使い始めることを考えていましたが、それに対して反対する人々もいます。推奨される方法は何ですか? stdとboostはそれほど大きな害はないはずです。どこでstd ::とboost :: prefixesを使うべきですか?
答えて
私はusing namespace
をヘッダーではなくC++ファイルでのみ使用します。また、ほとんどの場合、必要でない穴名前空間を使用します。たとえば、またはusing std::tr1::shared_ptr
と書くと、shared_ptr
の実装を簡単に切り替えることができます。
サンプル:
#include <iostream>
using std::cout;
int main()
{
cout << "test" << std::endl;
return 0;
}
Using namespace ...
は面白かったです。
あなたがそれを使う正当な理由があれば、そうしてください(そして、これらの名前空間からのものを頻繁に使用するのが正当な理由です)。あいまいな理由で自分がしたくないことを自分に伝える狂信者の話を聞かないでください。
しかし、これらの点での推論のための良いソースは、C++よくある質問liteのである: http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5
私はそれを読んで、まだあなたがしたいようにそれを使用することを決定しました。
コードを読むとき、コードが:: std :: prefixesで混乱しているということは、本当に面倒です。しかし、シンボルができるだけ簡単にどのような名前空間になっているのかを知りたければ...
これはIDEの仕事ではありませんか?
私のIDEが 'view short typenames'をサポートしていない限り、私はusing
という一般的なシンボル(STL、boostなど)の宣言に傾いています。最初の可読性!
私の独自のルールは以下のとおりです。ヘッダファイル内
- 、すべての名前が明示的に、例えば修飾されています
std::string
、std::cout
などをソースファイルに使用する場合は、ファイルの先頭によく使用される名前の句を使用してください。std::string;
using namespace xxxx;
を生産コードに使用しないでください。
std
という名前空間は、名前を短くするために名前が付けられています。接頭辞std::
はわずか5文字で、ほとんど世界の終わりです。これは、System.Collections.Generic
のような.NETの名前空間とは異なります。入力が容易になるように設計されています。
そのため、通常は接頭辞std
を入力します。ブーストもあまりにも悪くないので、私は通常それもタイプします。 typedefを使用して短い何か(例えばnamespace fs = boost::filesystem
)
にサブ名前空間(例えばboost::filesystem
)別名通常
私は自由にあまりにも役立ちます。 タイプを頻繁に参照する必要がある場合は、using
を追加するだけです。
しかし、私は一般的にヘッダーにはusing
を避けようとしています。私はそれらを使用するときに実際の名前空間を汚染しないように関数スコープに置くことを好みます。
C++には、グローバル名前空間を汚染することなく、名前空間の指定を避けるためのツールが多数用意されています。
これはちょうど5文字ですが、次のようになります:boost :: shared_ptr
私はその場合にtypedefを使用します typedef std :: pair
ヘッダーファイルでは、はい。これは、 "std :: name_of_std_memberを使用する"を使用するためです。または「using namespace std;」を使用します。そのヘッダーファイルを含む他のすべてのファイルにグローバルスコープのシンボルが表示され、名前空間の目的が破られます。しかし、ソースファイルでは、 "using namespace std;"を使用しても問題ありません。その名前空間のシンボルを "std ::"という接頭辞で利用できるようにします。
私はusing namespace
を機能体内でのみ使用します。ヘッダーファイルでは、私は常に名前空間を明示的に修飾します。
(モックアップのために同僚のコードをコピーするときはめったにありません)、私はusing namespace
を名前空間の範囲(つまり、翻訳単位全体)で使用します。
- 1. C++ 11:boost :: make_tupleはstd :: make_tupleとどう違うのですか?
- 2. boost :: lexical_castとstd :: boolalphaはどうやって使うのですか?
- 3. boost :: bimapでstd :: for_eachを使うにはどうすればいいですか?
- 4. このBoost.Asioチュートリアルでstd :: bindとboost :: bindを同じ意味で使うことができない
- 5. boost :: bindをマップで使用すると、std :: pairとstd :: map :: value_typeのバインディングはどうなりますか?
- 6. boost :: unordered_mapをstd :: shared_ptrで使用できますか?
- 7. boost :: iequalsをstd :: u16stringで使用する
- 8. ここではどのイベントを使うべきですか?
- 9. 私はここでどのデザインパターンを使うべきですか
- 10. Boost :: bindとstd :: copy
- 11. std :: ostream_iteratorでboost IOStreamsを使用
- 12. clojureでどこでdefrecordを使うべきですか?
- 13. ポインタのセットにstd :: setまたはstd :: unordered_setを使うべきですか?
- 14. 私はstd :: vectorを使うべきですか?
- 15. std :: threadでboost :: bindを使う方法(Wt C++で)
- 16. std :: minulateでstd :: accumulateを使用することはできますか?
- 17. どこでXSP.endAjaxLoading()を使うべきですか?
- 18. どこで何を使うべきですか? urllibはのpython3
- 19. boost :: lexical_cast <std::string>(Int_Type)までスローできますか?
- 20. boost :: lexical_castをfolly :: fbstringとどうやって使うことができますか?
- 21. std :: streamoffとstd :: streamsizeを使用するためにどのヘッダを含めるべきですか?
- 22. WatiN DomContainerクラスはどこで使うべきですか?
- 23. boost :: any_castとstd :: optionalの
- 24. boost :: interprocess - std :: string vs std :: vector
- 25. std :: mapを使ってstd :: ofstreamを扱うことは可能ですか?
- 26. どこでデータベースを使うべきですか?また、mysqlのどこでテーブルを使用しますか?
- 27. boost :: variant要素でいっぱいのstd :: setを子孫でソートすることはできませんか?
- 28. boost :: lambda std :: map
- 29. gdbでboost :: ptr_deque <std::string>を調べる方法は?
- 30. Boost Overload strange behavior .. `int(int)、int(std :: string)`が `int(int)、int(std :: string)、std :: string(std :: string)`とどのように違うのですか?
私はそれについて知らなかった - これは私の問題を解決する。 –
いいえ、残念なことに - それはありません:(g ++はサポートしていません –
それを聞くのは奇妙です。 tは標準です。 –