c++using namespace詳細


namespaceとは,指標識別子の様々な可視範囲である.C++標準ライブラリのすべての識別子はstdというnamespaceに定義されている.
1:
は違います.前者は接尾辞がありません.実際には、コンパイラincludeフォルダに表示されます.両者は2つのファイルで、ファイルを開くと、中のコードが違います.
接尾辞は.hのヘッダファイルc++標準はすでに明確にサポートされていないことを提案し、以前の実装は標準ライブラリ機能をグローバル空間に定義し、バンドに宣言した.h接尾辞のヘッダファイルでは,c++標準はCと区別するため,ネーミングスペースを正しく使用するためにヘッダファイルに接尾辞を使用しないことを規定する.h.
したがって、の場合、cでライブラリ関数を呼び出すことに相当し、グローバルネーミング空間、すなわち初期のc++実装を使用する.を使用する場合、ヘッダファイルはグローバルネーミングスペースを定義していません.namespace stdを使用する必要があります.これでcoutを正しく使うことができます.
2:
namespaceとは,指標識別子の様々な可視範囲である.
C++標準ライブラリのすべての識別子はstdというnamespaceに定義されている.
namespaceの概念のため、C++標準ライブラリの任意の識別子を使用する場合、3つの選択肢があります.
1、識別子を直接指定します.例えばstd::ostreamではなくostream.完全な文は次のとおりです.
   std::cout << std::hex << 3.4 << std::endl;
2、usingキーワードを使う.
   using std::cout;
   using std::endl;
以上のプログラムは
   cout << std::hex << 3.4 << endl;
3、最も便利なのはusing namespace stdを使うことです.
例:
   #include
   #include
   #include
   using namespace std;
これにより、ネーミングスペースstdで定義されたすべての識別子が有効になる(露光).グローバル変数として宣言されているように.では、上記の文は次のように書くことができます.
   cout << hex << 3.4 << endl;
標準ライブラリは非常に膨大なため、プログラマが選択したクラスの名前や関数名が標準ライブラリの名前と同じになる可能性があります.したがって,このような状況による名前の衝突を避けるために,標準ライブラリ内のすべてを名前空間stdに格納する.しかし、これはまた新しい問題をもたらします.多くの既存のC++コードは、長年使用されてきた擬似標準ライブラリの機能に依存しており、グローバル空間の下にあります.
だからなどのヘッダファイルは,従来のC++コードと互換性を保つため,新しい規格をサポートするためである.
ネーミングスペースstdは標準ライブラリの名前をカプセル化し、標準ライブラリは以前のヘッダファイルと区別するため、一般的に「.h」を付けない
今日VISUAL C++を使って小さいプログラム(VS 2005)を书いて、とても简単でとても简単で、しかしコンパイルは1つの奇怪な问题が现れません:エラー1 error C 2668:“max”:重荷関数の呼び出しに対して明确ではありません
最初のコードは次のとおりです.
ダブルクリックコード全選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15  #include <iostream> using namespace std;
  template < typename T> T max (T a,T b) { return ((a>b)?a:b); } void main() { double x,y; cin>>x>>y; cout<< "Max number is " <<(max(x,y))<<endl; cin>>x; }
私はこのコードをVC++6.0の下に置いて意外にも通過して、プログラムの運行も正常です.これは私に理解できない.後でやっと分かった!
実はstdネーミングスペースの下にもう一つのMAX関数があり、しかも実現する機能も同じです・・・気を失いました.定義機能に移行すると、マイクロソフトがMAX関数をどのように書いているかがわかります.ここでは軽蔑されないようにマイクロソフトのコードを貼らない.
なぜこのエラーが発生したのか分かりました.コードを書き直します.
ダブルクリックコード全選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17  #include <iostream> using std::cin; using std::cout; using std::endl;
  template < typename T> T max (T a,T b) { return ((a>b)?a:b); } int main() { double x,y; cin>>x>>y; cout<< "Max number is " <<(max(x,y))<<endl; cin>>x; }
これは私が比較的に推薦する方法で、C++PRIMER、EFFECTIVE C++の上ですべてこのような方式を使うため、しかし譚浩強の本の上ですべて1つのusing namespace stdです;これで終わりです.簡潔でずっと使っていると思いますが、そんなに多くの問題をもたらすとは思いませんでした.以前は友元関数で不思議な間違いに遭遇しました.
実は2つの簡単な解決策があります.それは、自分が定義した関数を他の名前に変更したり、マイクロソフトが直接提供した関数を使ったりすることです.マイクロソフトが提供する効率は決して私たちが書いたより低くないと信じています.良いプログラミング習慣を身につけてほしいです^-^