读书人

一件和const有关的巨诡异的事情无法

发布时间: 2013-12-15 22:17:19 作者: rapoo

一件跟const有关的巨诡异的事情,无法理解
在某个头文件中定义了一个外部变量:

double eps = 1e-10;

编译的时候没问题,但是运行的时候报错,说

one or more multiply defined symbols found

可是我把它改成

const double eps = 1e-10;

就没问题了。

这个是什么原因?太诡异了吧!我用的是VS2008
[解决办法]
不要在头文件里定义一个会更改的变量,会导致所有包含此头文件的模块里都有同一个变量。
const自带static属性,各模块彼此隔离,所以可以正常通过编译。
[解决办法]
时刻要注意区分内部连接和外部连接
以下情况有内部连接:   
  a)所有的声明   
  b)名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义   
  c)enum定义   
  d)inline函数定义(包括自由函数和非自由函数)   
  e)类的定义   
  f)名字空间中const常量定义   
  g)union的定义   
  外部连接:在一个多文件程序中,假如一个名称在连接时可以和其它编译单元交互,那么这个名称就有外部连接。   
  以下情况有外部连接:   
  a)类非inline函数总有外部连接。包括类成员函数和类静态成员函数   
  b)类静态成员变量总有外部连接。   
  c)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量   
  下面举例说明:   
  a)声明、enum定义、union定义有内部连接

读书人网 >C++

热点推荐