C++ 为什么常量x在包含它时是可以的

C++ 为什么常量x在包含它时是可以的,c++,constants,C++,Constants,普通的 int i=10 cpp one: include "common.h" cpp two: include "common.h" 将显示多个定义错误 但是我改变了代码:从int I=10到const int I=10,这是可以的。 我的问题是为什么它是好的?有什么区别 PS:我知道为什么只有int I=10不正常,但我不知道为什么常量I正常?全局常量对象不需要任何存储。全局常量对象不需要任何存储。在C语言中,全局常量变量有其地址,在C++中,它被看作编译时常数并放入符号表中,因此

普通的

int i=10

cpp one:
include "common.h"


cpp two:
include "common.h"
将显示多个定义错误

但是我改变了代码:从int I=10到const int I=10,这是可以的。 我的问题是为什么它是好的?有什么区别


PS:我知道为什么只有int I=10不正常,但我不知道为什么常量I正常?

全局常量对象不需要任何存储。

全局常量对象不需要任何存储。

在C语言中,全局常量变量有其地址,在C++中,它被看作编译时常数并放入符号表中,因此它是唯一的。
在C语言中,全局const变量有其地址,而在C++中,它被看作编译时常数,放入符号表中,因此是唯一的。 您好,Chinese buddy:D

这是因为命名空间范围中的const限定声明默认具有内部链接:

7.1.5.1.2。在命名空间作用域中声明的具有常量限定类型的对象具有内部链接,除非它显式声明为extern或之前声明为具有外部链接

具有内部链接的对象对链接器不可见,因此当您在多个转换单元中具有相同的声明时,链接器不会注意到。这是有意义的,因为具有相同值的所有整数常量彼此相同

另一方面,没有常量限定符的对象具有外部链接。这就是在链接期间导致多个定义错误的原因。

这是因为命名空间范围中的const限定声明默认具有内部链接:

7.1.5.1.2。在命名空间作用域中声明的具有常量限定类型的对象具有内部链接,除非它显式声明为extern或之前声明为具有外部链接

具有内部链接的对象对链接器不可见,因此当您在多个转换单元中具有相同的声明时,链接器不会注意到。这是有意义的,因为具有相同值的所有整数常量彼此相同


另一方面,没有常量限定符的对象具有外部链接。这就是导致链接期间出现多个定义错误的原因。

即使缺少命名空间,这也在命名空间范围内?@MikeDeSimone是的,当您没有显式命名空间时,声明被视为在默认命名空间中。因此,即使缺少命名空间,这也在命名空间范围内?@MikeDeSimone是的,如果没有显式命名空间,则声明将被视为位于默认命名空间中。您来自哪个国家?:Dqq多少,我来加下,技术无高低,都是学习中。。你来自哪个国家Dqq多少,我来加下,技术无高低,都是学习中。。不是真的。无论如何,外部常数int i=10;还将定义一个全局常量对象,但在该头文件中无效,因为它将在每个翻译单元中定义一个不同的对象,就像int i=10一样;是的,不是真的。无论如何,外部常数int i=10;还将定义一个全局常量对象,但在该头文件中无效,因为它将在每个翻译单元中定义一个不同的对象,就像int i=10一样;做