一件跟const有关的巨诡异的事情,无法理解

哈利_蜘蛛侠 2013-12-12 06:26:44
在某个头文件中定义了一个外部变量:

double eps = 1e-10;

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

one or more multiply defined symbols found

可是我把它改成

const double eps = 1e-10;

就没问题了。

这个是什么原因?太诡异了吧!我用的是VS2008
...全文
199 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-12-13
  • 打赏
  • 举报
回复
C++ const 内部连接的实质是: C++ const 定义的,可能就是常量。 而常量通常,可能无需分配内存,所以就内部连接了。 特殊情况需要分配的,作为静态变量处理。 C : const 定义的不是常量,所以看作外部变量。
qq120848369 2013-12-13
  • 打赏
  • 举报
回复
全局变量重复定义了,const只不过处理比较特殊。
赵4老师 2013-12-13
  • 打赏
  • 举报
回复
《程序员的自我修养——链接、装载与库》
baichi4141 2013-12-13
  • 打赏
  • 举报
回复
引用 6 楼 u011873969 的回复:
[quote=引用 5 楼 u012908616 的回复:] 无论如何,运行时报错,确实挺诡异,难道是动态链接? 在头文件中定义变量,然后被一个或多个cpp文件包含时,相当于在每个cpp文件中定义这个变量。 这些cpp在编译成obj文件时可能都OK, 但将obj链接至一起时,因为包含相同的符号名称,导致冲突,链接失败。 但楼主居然链接成功了。。。
额,好像就是链接时报错,不过VS的链接和运行是同时的。[/quote] 链接和运行不可能是同时的
Adol1111 2013-12-12
  • 打赏
  • 举报
回复
全局变量重复定义而已 const全局变量整个工程只分配一次 static全局变量作用域仅限在当前编译文件内,其他编译单元可以同名但不是同一个变量 普通全局变量每个引入该头文件的编译文件都会产生一次,但作用范围是整个工程,所以会命名冲突 建议用extern来声明全局变量,extern表示外部链接,不同于static这种内部特性,整个工程都算同一个,但又不像const不能修改。
哈利_蜘蛛侠 2013-12-12
  • 打赏
  • 举报
回复
引用 5 楼 u012908616 的回复:
无论如何,运行时报错,确实挺诡异,难道是动态链接? 在头文件中定义变量,然后被一个或多个cpp文件包含时,相当于在每个cpp文件中定义这个变量。 这些cpp在编译成obj文件时可能都OK, 但将obj链接至一起时,因为包含相同的符号名称,导致冲突,链接失败。 但楼主居然链接成功了。。。
额,好像就是链接时报错,不过VS的链接和运行是同时的。
Todd_Pointer 2013-12-12
  • 打赏
  • 举报
回复
无论如何,运行时报错,确实挺诡异,难道是动态链接? 在头文件中定义变量,然后被一个或多个cpp文件包含时,相当于在每个cpp文件中定义这个变量。 这些cpp在编译成obj文件时可能都OK, 但将obj链接至一起时,因为包含相同的符号名称,导致冲突,链接失败。 但楼主居然链接成功了。。。
  • 打赏
  • 举报
回复
时刻要注意区分内部连接和外部连接 以下情况有内部连接:      a)所有的声明      b)名字空间(包括全局名字空间)中的静态自由函数、静态友元函数、静态变量的定义      c)enum定义      d)inline函数定义(包括自由函数和非自由函数)      e)类的定义      f)名字空间中const常量定义      g)union的定义      外部连接:在一个多文件程序中,假如一个名称在连接时可以和其它编译单元交互,那么这个名称就有外部连接。      以下情况有外部连接:      a)类非inline函数总有外部连接。包括类成员函数和类静态成员函数      b)类静态成员变量总有外部连接。      c)名字空间(包括全局名字空间)中非静态自由函数、非静态友元函数及非静态变量      下面举例说明:      a)声明、enum定义、union定义有内部连接
allenltiverson 2013-12-12
  • 打赏
  • 举报
回复
引用 1 楼 baichi4141 的回复:
不要在头文件里定义一个会更改的变量,会导致所有包含此头文件的模块里都有同一个变量。 const自带static属性,各模块彼此隔离,所以可以正常通过编译。
  • 打赏
  • 举报
回复
C++中,const默认使用内部连接.而C中使用外部连接.
baichi4141 2013-12-12
  • 打赏
  • 举报
回复
不要在头文件里定义一个会更改的变量,会导致所有包含此头文件的模块里都有同一个变量。 const自带static属性,各模块彼此隔离,所以可以正常通过编译。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧