为什么const x在多重包含时是可以的
why const x is ok when multi include it
common.h
int i=10
cpp one:
include "common.h"
cpp two:
include "common.h"
将显示多个定义错误,
但我更改了代码:从int I=10更改为const int I=10,这是可以的。我的问题是为什么它是可以的?有什么不同。
PS:我知道为什么只有int I=10是不好的,但我不知道为什么const I是好的?
这是因为命名空间范围中的const
限定声明默认具有内部链接:
7.1.5.1.2在命名空间作用域中使用const限定类型声明的对象具有内部链接,除非它被明确声明为extern或之前声明为具有外部链接。
具有内部链接的对象对链接器来说是不"可见"的,因此当您在多个翻译单元中有相同的声明时,链接器不会注意到。这是有道理的,因为所有具有相同值的整数常数都是相同的。
另一方面,没有const
限定符的对象具有外部链接。这就是在链接期间导致多重定义错误的原因。
在C语言中,全局常量变量有其地址,而在C++中,它被视为编译时常数,并放入符号表中,因此它是唯一的。
嗨,中国朋友:D
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- 当子类需要在 c++ 中相互包含时,继承有缺陷
- 如何使用特征访问编译时const值
- 我想将指向 const 对象的指针放入包含非 const 指针的容器中.我有什么选择
- 使用 Qt 标头的递归包含时出错
- C :使用Visual Studio编译器时const Pointers
- 包含多个源文件中包含的"const"的头文件
- 为什么const x在多重包含时是可以的
- 什么是.lib文件包含时生成DLL
- <QNetworkAccessManager><QNetworkReply> 在 BB10 应用程序开发的 cpp 文件中包含 时出错
- 两个类#相互包含时出错
- 按值传递时"const"不是多余的吗?
- 删除不必要的包含时最佳做法是什么?
- 为什么 setjmp 在包含 时不在 std 命名空间中?<csetjmp>
- 如何从另一个文件中调用与另一个文件中同名的函数(当两者都包含时)
- 当两个头文件在c++中相互包含时,如何编写makefile
- 函数在作为 GLUT 项目的一部分包含时不读取文件
- 当不需要包含时
- 在C++重载运算符时"const"是什么意思