2011-07-19 3 views
2

メッセージIDに対応する一連の定数文字列があります。私は、これらの定数がアプリケーションのさまざまなクラスで使用されるため、これらの定数の集中化された場所を作成しようとしています。私はもともと、それらを含む名前空間を作成するつもりだった。名前空間にメッセージ定数をラップする

// MessageIDs.hh 
namespace MessageIDs { 
    const std::string kMessage1("Message1"); 
    ... 
} 

それから私は、内部/外部結合の定義について読み始め、今、私は質問のカップルを持っています。

1)定数をexternにしないという唯一の欠点は、内部結合を持つのでテンプレート引数として使用できないという事実だけですか?

2)わからない私のアプローチには他に欠点がありますか?

+0

代わりに、グローバルな 'enum'を使用します。 –

答えて

2

1)私はこのアプローチの明確な利点の1つを見ています。正しい場所に常に定義された定数の値が表示されます。私。定数をexternに定義する必要がある場合は、イニシャライザと一緒に1つのcppファイルに定義を置き、値を指定しないでextern constをヘッダに残す必要があります。

あなたが言及した欠点(テンプレートパラメータとして使用できないこと)は実際には軽微ですが、しばしばstd :: stringテンプレートパラメータが必要ですか?私は感謝してそれらを見ていない。

2)おそらく別の小さな問題は、ヘッダーファイルを含むすべての翻訳単位に実際にstd :: stringオブジェクトが重複していることです。

このような文字列定数の場合、const char *はすべてのケースで最適な解決策です。

+0

複製は '__declspec(selectany)'で削除することができます。これにより、リンカーは1つのオブジェクトのみを選択し、残りの部分を取り除きます(msvcではヘッダーのみの外部的に見えるオブジェクトの 'extern const 'も許可します。' xnamath.h '例として)。 – Necrolis

+0

私が文字列オブジェクトを作成したのは、文字列オブジェクトを毎回作成しなければならないので、これらの定数の1つを使用しようとするたびにオーバーヘッドが発生するからです。 (関数の引数としてのEx) – sfpiano

関連する問題