2

ここにいるほとんどの C++ プログラマーは、グローバル名前空間を汚染することは悪い考えであることに同意すると思いますが、このルールを無視できる場合はありますか?

たとえば、特定のアプリケーション全体で使用する必要がある型があります。次のように定義する必要があります。

mytypes.h

typedef int MY_TYPE;

foo.cpp

MY_TYPE myType;

または、名前空間を使用します。

mytypes.h

namespace ns {
typedef int MY_TYPE;
}

foo.cpp

ns::MY_TYPE myType;
...
using namespace ns;
MY_TYPE myType;

どっちがいい?最初の方法を使用してもよい場合はありますか?

4

4 に答える 4

7

別の名前空間で型を定義し、使用できます

using ns::MY_TYPE;
于 2008-11-06T08:12:36.267 に答える
4

ライブラリはしてはいけません、アプリケーションはそうしてはいけません。

複数の人がアプリケーションで作業する場合、もちろん明確なルールが必要であり、最も明確なルールは「しない」です。ただし、これはすべての場合に理想的というわけではありません。

「using」ステートメントは、CPPファイルの上にのみ配置する必要があり、ヘッダーには配置しないでください。ただし、近い将来、ほとんどのコンパイラーではヘッダーに常駐する必要があるため、テンプレートの作成が複雑になります。

私の経験では(大部分は大規模でありながら十分に分割されたプロジェクトを持つ小規模なチーム)、それぞれのコードを制御し、わかりやすい名前を主張する限り、名前空間の汚染はそれほど問題にはなりません。私が覚えているケースはごくわずかであり、簡単に対処できました。ただし、サードパーティのライブラリには大きな問題がありました。ソースが利用可能であってもです。

巨大なチームまたは単一のコンパイルに入る巨大なプロジェクトを持つYMMV。

于 2008-11-06T13:53:34.703 に答える
4

私は名前空間を使用してライブラリ コードをアプリケーション固有のコードから分割し、大きなプロジェクトではプロジェクトを構成するさまざまなモジュールを分割します。

したがって、グローバル名前空間は、アプリケーション内の複数のモジュールで使用されるアプリケーション固有の型と関数に役立ちます。

したがって、MY_TYPEアプリケーション全体で使用する場合はグローバル名前空間に配置し、それ以外の場合は名前付き名前空間に配置します。

于 2008-11-06T08:09:51.670 に答える
3

グローバル名前空間を使用することにまったく同意しません (もちろん、を除いてmain)。アプリケーション全体で使用されるものについては、関連するすべての行の後、ファイルusing namespaceの先頭で使用できます。.cpp#include

于 2008-11-06T08:12:08.560 に答える