Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2336260
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-05-28 17:09:28

先报怨一下CU, 文章标题的限制太短, 很难表达清楚一句话!

在Effective C++(2nd)条款1中, Scott说:

class X {
    public:
        static const int NUM = 5;
};
// const int X::NUM;

int main(int argc, char *argv)
{
    printf("%d\n", X::NUM);
    return 0;
}


对这个情况, 在X内部的仅是个声明, 还必需另提供一份定义, 注意他用了必需, 我在3个主流编译器的证实下, 情况已不是这样, 不是必需了, 而是可选的, 提供一份定义也没错, 但对于整数类型, 现今的C++不再要求一定如此.

在VC2008, 
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
上都可以通过编译, 标准中也的确说对于整型家族可以如此.
其中 Comeau的编译器我现在手头还没有, 但它提供了一些在线编译你的C++代码的URL, 只是不能运行看结果.
实验结果是: 可以在类内部不指定初始化值. 在静态成员定义处指定, 也可以在内部指定, 定义处不指定. 还可以在内部即声明又定义时指定, 同时不额外提供一个外部定义.
查了Effective C++ 3rd, 作者对这个问题仍没有更新.

给大师挑刺是很危险的, 幸好我又去查对了相关主题的其它一些材料, 其中人称教主的BS在其主页上这么说:
I tend to use the "enum trick" because it's portable and doesn't tempt me to use non-standard extensions of the in-class initialization syntax.
老大是在解释为什么C++中强制了如此不便的限制, 以及如何应对. 但这里我不知道他是说整数类型的初始化本身也是非标准的, 还是担心其它编译器只是对初始化语法作了扩展, 看来, 声明+定义仍是中规中矩的安全做法.
阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~