4

匿名の名前空間内の「名前空間を使用する」ステートメントで、以下が合法であるかどうかが尋ねられました

//file.cpp
//....
namespace
{
    using namespace std;
}

int a(){
 cout << "bla";
}

答えは「そうです」でした。さらに、ユニティ ビルド ( https://stackoverflow.com/a/6474774/484230 ).

私の質問: 匿名の名前空間はそのような問題から私を救いますか、それとも using ディレクティブはまだファイル境界を伝播できますか? https://stackoverflow.com/a/2577890/484230では、同様のアプローチが提案されました。匿名の名前空間でも機能し、本当に安全ですか? もちろんstd悪い例ですが、たとえばusing namespace boost::assign;、一部の cpp ファイルでは非常に便利です。

4

2 に答える 2

9

匿名の名前空間に配置することと、匿名の名前空間の外に配置することに違いはありません。どちらでも同じ効果が得られ、名前空間全体がstdファイルの最上位の名前空間に取り込まれます。これは良くないことであり、避けるべきです。

「ファイル境界の伝播」に関しては、匿名の名前空間の外に置くと、それは行われません。他のファイルに感染できるのは、#includeヘッダーなどの他のファイルにあるファイルにある場合のみです。

于 2012-05-02T15:41:49.703 に答える
2

私の質問: 匿名の名前空間はそのような問題から私を救いますか、それとも using ディレクティブはまだファイル境界を伝播できますか?

ディレクティブがファイル境界を伝播できる唯一の方法は、他のファイルに#include "file.cpp"プリプロセッサ ディレクティブがある場合です。それも完全に合法ですが、うわー、それは悪臭を放ちます。ヘッダーではなくソース ファイルをインクルードすることは、標準的な慣行に大きく反します。

何かが合法だからといって、それが良いとは限りません。

usingを使用して他の名前空間を現在の名前空間に取り込む場合も、ほとんど同じことが言えます。using namespace <name>;は、ソース ファイルでも一般的に悪い形式と見なされます。

于 2012-05-02T15:51:15.850 に答える