你写,
“从我正在阅读和测试的所有内容来看,没有办法(没有预处理器宏)在共享标头中定义常量并确保每个 TU 不会为该常量创建自己的存储。”
幸好这是不正确的。
对于一个小的整数值,您始终可以只使用enum
. 权衡是你不能传递一个enum
值的地址,因为它没有地址。这是纯粹的价值。
但是,为整数值节省空间是一件毫无意义的事情,因为它太小了。
所以,让我们考虑一件大事,
struct BiggyThingy
{
unsigned char zeroes[1000000];
BiggyThingy(): zeroes() {}
};
现在我们如何BiggyThingy
在头文件中声明一个常量并确保整个程序只有一个常量?
使用内联函数。
那么最简单的就是这个:
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 )
或者,如果您想要更好的符号,您可以为每个翻译单元添加一个参考,就像内联函数解决方案一样。
免责声明:
编译器未修改的代码。
但我想你明白了。;-)