3

名前の競合を処理するには、コードを名前空間に埋め込む必要があることはわかっています。例えば

My-Header-Only-Library.hpp

    namespace AG {
    namespace My_Header_Only_Library {

    class Foo {
        ...
    };

    }
    }

だから私は AG::My_Header_Only_Library::Foo を持っています。

はい、私はしばしば 2 つのレベルを使用します - 最初のさまざまな AG、AFG、libAG など - 「私の」もの (私はこれらのライブラリのいくつかを何十年も維持してきましたValid<T>)。

また、さまざまなモジュールのサブ名前空間をよく使用します。

問題 #1: 名前空間の名前が衝突することがあります。

はい: 名前空間名 AG、AFG、libAG のすべてで衝突が見つかりました。はい、私と同じイニシャルを持つ会社に出くわしたことがあります。

(しばらくの間、私は GLEW を使用していましたが、これはかなりユニークな姓だと思っていました。当時、私はインターネット上で唯一の Glew であり、ARPAnet でイニシャル AG を持つ 48 人目の人物でした (AG48)。しかし、それ以来、OpenGL は、 Extensions Wrangler は、私からそれをほとんど奪ってしまいました。)

「namespace AG_some_random_stuff_675567」の方が衝突しにくいと思います。それは人々がすることですか?長いネームスペース名を使用してから、

using AG_lib = AG_some_random_stuff_675567

または、名前空間の名前を別のものに#定義するなどのトリックを試みたことはありますか?

例えば

#define AG something_more_unique

問題 2: 私は時々、会社に私の図書館を貸与したり、貸与したり、許可したりします。変更を元に戻すこと、つまりフォークしないことを少しお願いします。

それらのコーディング規則は同じではない場合があります。

名前空間の名前を変更してほしくありません。変更を元に戻すのが難しくなるためです。

Q: どうすればいいですか? 彼らにやらせる

using Their_Name = AG_some_random_stuff_675567
4

3 に答える 3

1

私は通常、名前空間に含まれるもの、フルネーム、作成日について何かから始めます。理論的には、これも衝突の影響を100%受けないわけではありませんが、かなり近い1です。本当に免疫に近いものが必要な場合は、GUIDを生成して、代わりにそれを使用できます。

そして、もちろんそうです、ほとんどの通常の使用のためにはるかに短いエイリアスがあります。残念ながら、完全な名前空間名の代わりにエイリアスを常に使用できるとは限りませんが、それは人生です。


  1. 少なくとも私にとっては、それはかなり近いです-しかし、より一般的な名前は、はるかに少ない保護を提供します。
于 2013-01-11T02:31:55.473 に答える
0

ダメージコントロールモードになっています。内部名と衝突した状態でライブラリを受け取った会社は、衝突したライブラリを明確にするためにクライアントコードを修正する必要があります。

AG_some_random_stuff_675567明らかにやり過ぎであり、AG明らかに(おそらく振り返ってみると)衝突する可能性が高すぎます。適度にユニークなものを選んでください。そうすれば、将来のクライアントはusingエイリアスなしでそれを使用できます。たとえばall_good。(ただし、クライアントに独自のusingエイリアスを追加するように要求しても、マーケティングやサポートの問題が発生しない場合は、名前空間を使用random_stuffすると完全に安全になります。)

次に、独自のコード内に追加using namespace AG = all_good;し、下位互換性の手段として同じことを行うように古いクライアントに指示できます。

おそらく、プリプロセッサフ​​ラグを使用して、グローバル名前空間でディレクティブを取得するユーザーを選択することでクライアントの移行を支援しますusingが、プリプロセッサマクロを使用して名前空間の名前を変更する方法はありません。そして、そのような名前で、AG衝突することがすでに証明されています。

于 2013-01-11T02:34:32.827 に答える
0

イニシャルを使用せず、既に割り当てられている名前空間を使用してください。たとえば、完全修飾ドメイン名を逆にする Java の手法は非常にうまく機能します。私のコードで安全に使用できます

namespace com {
    namespace benvoigt {
    }
}

他の誰かがドメインの所有権を持つことは不可能であるため、外部エンティティと競合しないことを知っておいてbenvoigt.comください。

于 2013-01-11T02:47:03.280 に答える