vc++对类内const static int变量初始化后的处理
2008-11-11 15:22
225 查看
昨天论坛里有人发帖http://topic.csdn.net/u/20081110/21/58b849c2-efcd-473e-a59f-9e783223a15c.html提出相关问题。
发现,在类内初始化了const static int变量后,总是出现连接错误。后经测试后果然是,但并不总是。但这样显然是跟标准不符的,标准说对于const static int是可以在类内初始化的,但还是需要在类外定义。
现把存疑记录在此。
的确是个很奇怪的问题。
1、int型的const static 成员可以不必类外定义?或许吧,试过几个编译器的确如此。
2、但标准是说需要类外定义的呀。用编译器测试,当类定义、调用程序都在一个文件中时,类外定义const static成员都顺利通过了(gcc vs2008)
3、但进一步看,分开类定义和调用程序成两个文件时,问题来了。gcc顺利通过。vs2008出现重复定义,连接出错。这时候无论你把类外定义语句放到哪个文件,vs都通不过。(当多个文件include类声明,只要有文件在类外定义了变量,所有的include了头文件的其他cpp都会出连接错)
这样看起来,vs是把这种类内的const static int变量自动定义和分配了空间。但奇怪在,当只有一个文件include类声明时,又是可以类外定义的。不知道是不是属于vs的bug。(至少是跟标准不符吧)
后来在其他论坛也查到类似问题http://www.megasolutions.net/cplus/Is-this-a-bug-of-the-C++-compiler-of-VS-2005_-77566.aspx?hide_quotes=no
也是怀疑是否是vc++的bug。
See an example at first:
hdr.h
--------------
struct X
{
static const int m = 9;
};
=====================
source1.cpp
---------------
#include "hdr.h"
const int X::m;
=====================
main.cpp
---------------
#include "hdr.h"
int main()
{}
=====================
发现,在类内初始化了const static int变量后,总是出现连接错误。后经测试后果然是,但并不总是。但这样显然是跟标准不符的,标准说对于const static int是可以在类内初始化的,但还是需要在类外定义。
现把存疑记录在此。
的确是个很奇怪的问题。
1、int型的const static 成员可以不必类外定义?或许吧,试过几个编译器的确如此。
2、但标准是说需要类外定义的呀。用编译器测试,当类定义、调用程序都在一个文件中时,类外定义const static成员都顺利通过了(gcc vs2008)
3、但进一步看,分开类定义和调用程序成两个文件时,问题来了。gcc顺利通过。vs2008出现重复定义,连接出错。这时候无论你把类外定义语句放到哪个文件,vs都通不过。(当多个文件include类声明,只要有文件在类外定义了变量,所有的include了头文件的其他cpp都会出连接错)
这样看起来,vs是把这种类内的const static int变量自动定义和分配了空间。但奇怪在,当只有一个文件include类声明时,又是可以类外定义的。不知道是不是属于vs的bug。(至少是跟标准不符吧)
后来在其他论坛也查到类似问题http://www.megasolutions.net/cplus/Is-this-a-bug-of-the-C++-compiler-of-VS-2005_-77566.aspx?hide_quotes=no
也是怀疑是否是vc++的bug。
See an example at first:
hdr.h
--------------
struct X
{
static const int m = 9;
};
=====================
source1.cpp
---------------
#include "hdr.h"
const int X::m;
=====================
main.cpp
---------------
#include "hdr.h"
int main()
{}
=====================
相关文章推荐
- vc++对类内const static int变量初始化后的处理
- const 成员 static 成员 const static int 成员初始化
- C++常量折叠和类中const、static成员变量初始化
- C++ static、const和static const类型成员变量声明以及初始化
- C++ static、const和static const类型成员变量声明以及初始化
- 关于static const int可以在 声明时初始化的思考
- C++ static、const和static const类型成员变量声明以及初始化
- 在类声明中,静态(static)常量(const)泛整数型(char, int, DWORD)可以直接初始化
- C++ static、const和static const类型成员变量声明以及初始化
- c++类中const/static/const static成员变量初始化
- const 成员 static 成员 const static int 成员初始化
- static, const 和 static const 变量的初始化问题
- [置顶] C++ static、const和static const类型成员变量声明以及初始化
- C++ static、const和static const类型成员变量声明以及初始化
- static变量初始化 静态块
- Java中static变量的初始化顺序
- 对象的初始化列表const变量的初始化
- 从IL代码看const,readonly,static的初始化
- C++类的const、static和const static数据成员的初始化
- static变量的初始化和赋值的区别