Code Bye

如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义

 

c++ primer中提到:
如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义。

我创建了3个cpp文件:

test.cpp

#include <iostream>
#include "con.h"

void a();

int main() {
	std::cout << con << std::endl;
	a();
	return 0;
}

con.h

#include <cmath>

#ifndef FILE_H
#define FILE_H
using std::sqrt;

const double con = sqrt( 4 );
#endif

#include <iostream>
#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.

10分

你这个不是用的就是常量表达式吗..哪里有变量 sqrt(4) 就是一个常量啊
 
常量表达式是编译器在编译时就能够计算出结果的整型表达式
sqrt( 4 ) 不是
 
有人知道么

10分

你程序本身就没什么问题,虽然不是在编译时就确定,但程序运行时首先会进入到sqrt()函数进行计算常量的值,楼主可以加断点自己试

另外你也说,书上是说不应该,而没说不能(如果是在这个头文件后部分的函数有可能会找不到)

10分

C++ const 是缺省内部链接的,
你的这个常量初始化代码,很可能会生成很多份,
每个#include的头文件一份。

10分

不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义