2

編集: いくつかのコードをリファクタリングdefineし、名前空間エイリアスに置き換える予定です。「マクロは悪」という理由だけで、私はこれを行うことはできません。なぜ変更したいのか、変更しないとがうまくいかないのかを説明する必要があります。

「マクロは悪」というスタンスはさておき、#defineネームスペース エイリアスの欠点は何ですか?

コードを取る

#define MY_NAMESPACE my_namespace

namespace MY_NAMESPACE = my_namespace;

エイリアスを持つ理由は、質問の範囲外です。また、名前空間の名前が一意であり、他の場所には表示されないと仮定することもできます (つまり、その名前空間を参照するだけで、現在も将来も変数やクラスを参照することはできません)。とにかく)、そこにあいまいさはありません。

4

2 に答える 2

5

この特定のケースでは、状況によって異なります。名前空間のエイリアスを使用することでうまくいく場合は、通常のすべての理由から、マクロよりもエイリアスを使用することをお勧めします。しかし、両者は根本的に異なることをしています。エイリアスを使用して名前空間を開くことはできません。つまり、次のようになります。

namespace XYZ_ver1 {}
namespace XYZ = XYZ_ver1;

namespace XYZ {     //  Illegal!
}

これはマクロで機能します。実際、名前空間が現れる前にマクロを定義できます。これが必要な場合は、マクロを使用する必要があります。

于 2013-01-31T15:46:48.250 に答える
2

一般的に言えば、名前空間エイリアスの唯一の利点は、どこにでも配置できることです。次の例を見てください。

namespace a
{
    namespace that_is_a_great_namespace
    {
        namespace b = that_is_a_great_namespace;
    }
}

namespace that_is_a_great_namespace {}

副作用なしで変換a::that_is_a_great_namespaceされるマクロを定義することはできません。a::bここthat_is_a_great_namespaceでも、 に変換されbます。名前空間エイリアスは、そのような場合に名前の競合を解決するのに役立ちます。

ただし、すでに使用#definesしていて、すでに機能している場合、そのようなまれなケースのためにコードをリファクタリングしても役に立たない場合があります。

于 2013-01-31T15:50:47.600 に答える