14

名前空間fooの一部であるヘッダーファイルで関数(またはクラスは関係ありません)を宣言したと仮定します。

namespace foo
{
    void bar();
    …
}

長い間、cppファイルで関数を定義していたときに、名前空間を再度開いていました。

namespace foo
{
void bar()
{
    doSomething();
    …
}
}

それは、このようにして学んだことと、自分が取り組んでいるプロジェクトで使用されたためです。代わりにusingディレクティブを使用するプロジェクトに出くわした最近まで、私はそれについて本当に考えたことはありませんでした。

using namespace foo;

void bar()
{
    doSomething();
    …
}

最後に、フルネームを使用するオプションがあります。特にメンバーの多いクラスが関係している場合は、かなり退屈だと思います。私の意見では、ファイルのすべてのコンテンツが1つの名前空間の一部である場合はあまり意味がありません。

void foo::bar()
{
    doSomething();
    …
}

だから私の質問はどちらが優先されるべきか、そしてなぜですか?特に最初の2つのオプションに関して(ディレクティブとreopen名前空間を使用)。

4

2 に答える 2

14

I think the cleanest way is re-opening the namespace, and I've got the arguments to support it:

  • with your second option, with the using directive, it isn't clear that you're implementing a method in that namespace. You could as well be implementing a free function that uses something from the namespace.
  • the third option is usually used for implementing class member functions. If you look directly in the cpp file, it isn't clear that you're implementing a function from a namespace unless you know that namespace exists. The first thing that comes to mind is that you're implementing a class member function.
  • the first one is the clearest. You open the namespace and define a function inside it. The function is part of the namespace, and this is the implementation.
于 2012-06-07T09:08:06.183 に答える
6

using namespace最も怠惰な(したがって最も魅力的な)解決策であるとしても、それはしばしば良い考えではありません。Luchianが関数宣言があいまいであると言っていることに加えて(プロジェクトに不慣れな人は、それがスタンドアロン関数なのか名前空間内の関数なのかわからない)、後で名前空間に名前を導入して、自分の名前と衝突する可能性があるという事実今使用しているので、3番目の方法を使用することをお勧めするもう1つの理由があります。

3番目の方法を使用すると、コードの一貫性が高まります。Aが内部にある場合はB、常に。で定義しA::Bます。AがクラスでありB、クラス内の関数である場合は、を記述しtype A::B(args)ます。AがクラスでB静的メンバーの場合は、もう一度と記述しtype A::B = valueます。これAは名前空間ですが、それでも同じ概念です。B内部で定義されているAため、を再度使用する方が一貫性がありますA::B

(エディターがViMなどの場合、検索機能の追加ボーナスがあります)

于 2012-06-07T09:14:52.977 に答える