关于网友提出的“ 请问为什么 : 如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义”问题疑问,本网通过在网上对“ 请问为什么 : 如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 请问为什么 : 如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义
描述:本帖最后由 Yan25310 于 2015-06-14 15:04:20 编辑
c++ primer中提到:
如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义。
我创建了3个cpp文件:
test.cpp
#include
#include "con.h"
void a();
int main() {
std::cout << con << std::endl;
a();
return 0;
}
con.h
#include
#ifndef FILE_H
#define FILE_H
using std::sqrt;
const double con = sqrt( 4 );
#endif
#include
#include "con.h"
void a()
{
std::cout << "In a.cpp, con:"<< con << std::endl;
}
test.cpp和a.cpp都使用了con这个const,但编译运行ok,
输出:
2
In a.cpp, con:2
请问为什么会这样规定
然而程序却正常运行?
thx.
解决方案1: 你这个不是用的就是常量表达式吗..哪里有变量? sqrt(4) 就是一个常量啊
解决方案2: 不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
解决方案3: C++ const 是缺省内部链接的,
你的这个常量初始化代码,很可能会生成很多份,
每个#include的头文件一份。
解决方案4: 你程序本身就没什么问题,虽然不是在编译时就确定,但程序运行时首先会进入到sqrt()函数进行计算常量的值,楼主可以加断点自己试
另外你也说,书上是说不应该,而没说不能(如果是在这个头文件后部分的函数有可能会找不到)
以上介绍了“ 请问为什么 : 如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3622907.html