C++ 中的普通常量变量

Posted

技术标签:

【中文标题】C++ 中的普通常量变量【英文标题】:Plain Constant variables in C++ 【发布时间】:2012-11-23 13:35:03 【问题描述】:

默认为内部链接。 假设如果我有以下情况:

我在头文件中定义了一个const变量(const int var = 2)

然后我在两个 cpp 文件中包含头文件。

如果我尝试在两个 cpp 文件中获取该 const 变量的地址(即&var),那么这两个地址是否相同?我还需要一个小的工作代码来验证这个事实。

我不得不将此作为一个问题发布,因为我是新手,所以我无法在此线程中给出的this answer 的 cmets 中问它。

【问题讨论】:

我想你对 C++ 感兴趣。 C 的规则完全不同。所以我建议删除C标签。 这个测试肯定只需要一分钟? @Rook: 没有。"a"=="a" 在我的系统上,但实际上并不能保证。 constant variables not working in header的可能重复 【参考方案1】:

对于C++,由于内部链接,它不会相同 - 这是两个不同的对象。 在C 中则相反,const 将具有外部链接,因此您将由于重新定义而出现链接错误。

【讨论】:

这就是我的想法。但是我提到的链接中的答案说它会是一样的。 那里不是这么说的。仔细阅读 - 该答案中的“相同”地址是因为它是相同的全局变量。您应该阅读一下extern 关键字和全局变量的含义。 @UchiaItachi 你误读了那个答案。它说如果你在标题中将它们声明为外部在一个.cc文件中定义它们,那么你会得到相同的地址。 @icepack 哎呀!我读错了评论。我知道“extern”关键字,但在阅读答案中的第二点时没有抓住它。此外,在我的问题的开头使用“Plain”这个词有点暗示我知道“extern”。无论如何,感谢您指出我的盲读。呵呵!!【参考方案2】:

那这两个地址会一样吗?

没有。因为头文件在编译期间包含在 *.cpp 文件中,所以每个包含头文件的 *.cpp 都会创建自己的常量。

但是,如果你在 header 中使用extern const int var; 并在 *.cpp 中设置默认值,它们应该是相同的。

【讨论】:

【参考方案3】:

变量将有不同的地址。也有可能,如果您没有在任何地方引用变量地址,则变量将在编译期间用他的值替换,并且在二进制文件中您根本找不到变量值。

【讨论】:

如果它没有被引用,变量和它的值可以从二进制文件中完全省略,而不是替换

以上是关于C++ 中的普通常量变量的主要内容,如果未能解决你的问题,请参考以下文章

C++学习笔记-2:const关键字

C++内存四大区域

C++中const关键字的使用总结

cobol学习03——基本数据类型

C++ const 常量指针

Java 的普通函数中可以用static修饰变量吗,就像c++一样,或者matlab的persistent变量?