【问题标题】:Global variable and static global variable [duplicate]全局变量和静态全局变量[重复]
【发布时间】:2022-01-28 01:13:11
【问题描述】:

C++ 中的全局变量/const 和全局静态变量/const 有什么区别吗?在 cpp 文件或头文件中声明。

static const int x1 = someFunction(5);
const int x2 = someFunction(6);
static int x3 = someFunction(5);
int x4 = someFunction(6);

int main()
{
...

【问题讨论】:

  • @cigien 你关闭了我的链接并将一个没有解决方案的问题作为解决方案链接。
  • 重复闭包表示问题是重复的。目标上是否有解决方案并不真正相关(除了目标上至少有一个被赞成的答案的最低要求)。
  • @cigien Anoop Rana 在这里的回答要好得多。凯文的回答提供了很好的信息。
  • 是的,这是真的。不过我找到了一个更好的目标,并调整了这个问题的目标。那一个全面地解决了这个问题。

标签: c++ c++11 variables global-variables global


【解决方案1】:

案例一:对于 const 对象

相似度

在这两个版本中,变量都有内部链接。也就是说,x1x2 都有内部链接

区别

static const int x1 的情况下,变量是显式静态的,而在const int x2 的情况下,变量是隐式静态的。但请注意,它们仍然具有内部链接

案例二:对于非常量对象

相似度

x3x4 都有 非常量,这意味着我们可以修改它们。

区别

变量x3具有内部链接,而变量x4具有外部链接

【讨论】:

  • 我删除了我的错误答案,因为我错过了 const int x2 具有内部链接 because it's const。只是想我会在评论中提到它,以防其他人犯同样的错误:)
  • @Kevin 是的,我注意到你的回答中有这个错误。
  • @Kevin 我还没有看到你的答案。也许你最好取消删除它?因为我不仅在询问 const 案例,如果 const 和 non-const 之间存在差异
  • 好的,我会取消删除它
  • @Random 我在答案末尾添加了nonconst 对象的解释。看看吧。
【解决方案2】:

注意:这仅适用于变量不是 const 的情况。我已应 OP 的要求取消删除此答案

static int x1 具有内部链接,这意味着它只能从定义它的翻译单元(此 cpp 文件)中通过名称访问。如果此行在头文件中,则包含头文件的每个文件都将获得自己的变量副本。

int x2 具有外部链接,这意味着另一个翻译单元(cpp 文件)可以在全局范围内拥有extern int x2; 并访问该变量。如果此行在头文件中,并且多个文件包含头文件,则您违反了One Definition Rule,因为每个包含都定义了一次变量。您必须改为在标题中使用 extern int x2;,然后在单个 cpp 文件中使用您的 int x2 = ...; 以避免多个定义。

https://en.cppreference.com/w/cpp/language/storage_duration

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 2020-04-06
    • 2018-12-22
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多