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中提到的未定义出错。
[解决办法]