6

会社のいたるところで次のようなコードを目にします。

namespace {

const MAX_LIMIT = 50;
const std::string TOKEN = "Token";

}

ここで匿名の名前空間が必要な理由がわかりません。一方では、MAX_LIMITANDのローカル翻訳単位が必要ですTOKEN。しかし、それはconst. static constとシンプルconstの両方がローカル翻訳単位を達成します。

一方、ファイルのどこかに同じ名前の変数がある場合、名前の衝突はありません。

int foo()
{
std::string TOKEN = "MyToken"; // Clash! ::TOKEN vs TOKEN can be used.
}

それは匿名の名前空間を正当化します。constしかし、関数の外部で宣言された変数によって実際に既に使用されている変数名が関数内で必要になる頻度はどれくらいですか? 私の答えは決してありません。したがって、実際には、名前のない名前空間は必要ありません。ヒントはありますか?

4

3 に答える 3

5

あなたnamespaceが説明するように冗長です。namespace {と 一致 する を削除でき}ます。

::TOKEN1 つの違いは、異なる名前とを使用できることですunnamed_namespace::TOKEN。しかし、それはおそらく混乱を招くだけであり、コンパイル エラーが発生した方がよいでしょう。

投稿の後半が何についてのものかわからない場合、ローカル変数は と のTOKEN両方::TOKENを隠していunnamed_namespace::TOKENます。したがって、変更はその場合に違いはありません。

于 2016-05-12T09:21:50.707 に答える