あなたが書く、
「私が読んでテストしているすべてのことから、(プリプロセッサマクロなしで)共有ヘッダーに定数を定義し、各TUがその定数用に独自のストレージを作成していないことを確認する方法はありません。」
幸い、それは正しくありません。
小さな整数値の場合は、いつでも。を使用できますenum
。トレードオフは、値のアドレスがないため、値のアドレスを渡すことができないことですenum
。それは純粋な価値です。
ただし、整数値のためにスペースを節約することは、非常に小さいため、実行するのはかなり無意味です。
それで、大きなことを考えてみましょう、
struct BiggyThingy
{
unsigned char zeroes[1000000];
BiggyThingy(): zeroes() {}
};
BiggyThingy
では、ヘッダーファイルで定数を宣言し、プログラム全体で1つの定数を確保するにはどうすればよいでしょうか。
インライン関数を使用します。
最も単純なのはこれです:
inline BiggyThingy const& getBiggyThingy()
{
static BiggyThingy const theThingy;
return theThingy;
}
static BiggyThingy const& biggyThingy = getBiggyThingy();
各変換単位で(ポインターのように)参照がスペースを占有することを望まない場合は、表記を簡略化する参照なしで関数を使用してください。
テンプレート定数トリックを使用します。
代わりにテンプレートの特別なルールを利用して、定数を提供する別の方法を次に示します。
template< class Dummy >
class BiggyThingyConstant_
{
public:
static BiggyThingy const value;
};
template< class Dummy >
BiggyThingy const BiggyThingyConstant_<Dummy>::value;
typedef BiggyThingyConstant_<void> BiggyThingyConstant;
次のようにアクセスできます
foo( BiggyThingyConstant::value )
または、より適切な表記が必要な場合は、インライン関数ソリューションの場合と同様に、翻訳単位ごとに参照を追加できます。
免責事項:
コンパイラによって変更されていないコード。
しかし、あなたはアイデアを得ると思います。;-)