一般情况下,在头文件中都只是声明带有外部链接属性的变量,真正的初始化都是放到.cpp文件中,否则会产生多重定义错误(如果是static链接属性的则不会)
但是有时候,仅仅因为一个类里面的static变量就必须新建一个cpp文件来初始化他显然有点繁琐,这时候可以在.h文件中初始化,只是要利用__declspec(selectany)
例如:
class Float
{
public:
const static Float UNDEF;
.......
};
这种Float类型的所有函数基本都是内联,可以直接在.h文件中定义
而UNDEF这个成员非int类型,不能在类中直接初始化,如果又不想因为这个变量而新建一个cpp文件,比较方便的做法是再.h文件中用
__declspec(selectany) const Float Float::UNDEF = ((float(INFINITY));初始化
这样便可在多个其他文件引用Float类时消除重定义
另外__declspec(selectany)一个比较常用的例子是在模板类中,这个在WTL的源代码里面经常可以看到
最后说一点关于c++ const变量的链接属性,默认就是static
MSDN上关于selectany的介绍:http://msdn.microsoft.com/zh-cn/library/5tkz6s71