このプログラムを考えてみましょう:
line#
1 #include <string>
2
3 using namespace std;
4
5 struct string { const char* p; }; // Beware: another string!
6
7 int main()
8 {
9 string x; // Error: ambiguous - which string is wanted?
10 }
あなたはそれをコンパイルしようとすると、エラーが表示されます:
g++ using.cc -o using
using.cc: In function `int main()':
using.cc:9: error: use of `string' is ambiguous
using.cc:5: error: first declared as `struct string' here
/usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stringfwd.h:60: error:
also declared as `typedef struct std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::string' here
using.cc:9: error: `string' was not declared in this scope
using.cc:9: error: expected `;' before "x"
をここでの問題は、main()
がstring x;
を指定した場合、コンパイラはどうかわからないということですユーザー定義の::string
またはstd::string
が必要です。までとstruct string
含む...とmain()
前にあなたがして#include
ヘッダファイルに入れて -
は今ライン1〜5 ...あなたがプログラムの先頭部分を取ることを想像してみてください。変更はありません。まだエラーがあります。したがって、スタンドアロンプログラムの場合と同様に、ヘッダファイルにusing
文が含まれると、それらを含む他のコードに問題が発生し、ステートメントの一部があいまいになる可能性があります。
ヘッダーは直接的または間接的に - 任意の巨大な依存コードによって含めることができますが、それはもっと大きな痛みになる可能性があります。ヘッダからusing
文を削除
- 、または
<string>
の内容への変更、またはstd::
に影響を与える他のヘッダが...問題のヘッダを含むコードを壊すかもしれません。どちらの問題でも、依存するコードはコンパイル不可能になる可能性があり、別のコンパイルが試行されるまで問題が認識されないことさえあります。さらに、using
ステートメントに苦しんでいる人は、ファイルシステム/コードリポジトリのアクセス許可、法人権限などを持たずにヘッダからusing
ステートメントを削除したり、他の影響を受けるクライアントコードを修正することはできません。
つまり、ヘッダーがクラスまたは関数内で "使用する"場合、そのスコープを超えたコードには影響がないため、std ::への変更による潜在的な影響が大幅に軽減されます。
Yeapは、ここに行く:http://stackoverflow.com/questions/2152925/can-i-undo-the-effect-of-using-namespace-in-c – sharptooth
@sharptooth:「私にしてみましょうStackOverflowのそれはあなたのために」私の頭の中に飛び込んできました。 – Mehrdad
@Mehrdad:LOL、私たちはその段階には到達しないことを願っています。 – sharptooth