2008年8月1日星期五

static const integer member

在很多书上都对static const integer member的声明和定义做了介绍。这种常量常用来代替宏。一来,它可以被局限在类的范围之内,不会污染全局空间,也不用担心重名;二来,静态常量只有一份拷贝,不会占用太多地方。
一般来说,在类中可以使用in-class initialization的方式初始化静态整型常量,但是这还是被看作声明,因此在类声明外面,还需要对其进行定义。为了保证定义的唯一性,一般这种定义放在实现文件中(.cpp)。
比如:


test.h

class Category{
public:
static const int CATEGORY1 = 0x00000001;
//...
}

test.cpp

const int Category::CATEGORY1;

main.cpp

#include "test.h"
int main(){


//....
int _category = Category::CATEGORY1;
}


上述代码在几个编译器中的表现如下:
VC6 不支持该语法
VC8 编译通过,链接失败,报重定义
g++4.0 通过

VC6不支持该语法还情有可原,可是VC8竟然也会通不过,让我很是郁闷。为了使连接通过,只能不在test.cpp再对静态整型常量成员进行定义,我感觉这是编译器做了一些优化,使得在编译阶段,静态整型常量就已经分配了空间,并定义了符号,不再需要连接器去找了。以前看到一篇文章说VC8对C++标准的支持率已经达到了98%左右,但是很难相信如此简单又重要的一个特性,竟然也会不符合标准。可能VC编译器组的人都去忙重要的特性了吧。

写此文的目的是希望看到此文,而又不知道该问题的人能够少浪费差错的时间。这么一个小小的bug,浪费了我整整几个小时的时间去追查。你可能不以为然,但是当代码量多到一定程度时候,任何一个bug追查所花的代价都是巨大的。

没有评论: