读书人

c++中const变量定义与头文件包含的有关

发布时间: 2012-04-06 12:22:24 作者: rapoo

c++中const变量定义与头文件包含的问题
在《c++ primer》中有这么一句:要使const能在别的文件中访问,必须指定它为extern
还有这么一句:如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。该const变量应该在一个源文件中定义并初始化,应在头文件中为它添加extern声明,以使其能被多个文件共享

于是我构造了3个文件
main.h
#include<iostream>
using namespace std;
const int a = 3 * 5;
extern const int b;

main1.cpp
int returnB()
{
return 5 * 3;
}
extern const int b = returnB();

main.cpp
#include "main.h"
//extern const int b;
int main()
{
cout << a << endl;
cout << b << endl;
return 0;
}

我的意思是在main.cpp中定义const int b,在头文件main1.cpp中声明b,那么在包含头文件的main函数中使用b。可以不管我在main.cpp中是否再次声明b,编译器一直报b没有定义。难道必须还得在main.cpp中包含main1.cpp吗?这样的话extern const int b = returnB();中的extern就没有什么意义了。请教各位……谢谢

[解决办法]
上面的代码在 vs2005中没有问题。
[解决办法]
const int a = 3 * 5;
extern const int b;

其中a是定义,用常量表达式初始化,是可以放在头文件中的,但是按照c++ primer的说法,建议在前面加上extern。在其他cpp文件中可以直接调用。
至于b是声明,那么可以在其他cpp文件中定义,但是只能定义一次,定义后就不能改变值了。
这就取决于main1.cpp与main.cpp的编译先后顺序了,如果main1.cpp编译在前,那么b给出了定义,这个时候执行main就不会出错。相反,如果main1.cpp编译在后,那么执行main函数就会报错。
这也解释了gcc中报错,而vs中不报错的问题。
如果我以上解释是对的,那么以上写法就是代码风格的问题。写代码时要尽量避免c++ primer中提到的未定义出错。
[解决办法]

探讨
在全局作用域声明的const变量是定义该文件的局部变量。此变量值存在于那个文件中,不能被其他文件访问。
通过指定const变更为extern,就可以在整个程序中访问const对象。
//file1.cpp
extern const int bufSize = fcn();
//file2.cpp
extern const int bufSize;//使用file1.cpp中的bufSiz……

读书人网 >C++

热点推荐