【问题标题】:How to access a static linkage variable in other files in C++?如何在 C++ 中访问其他文件中的静态链接变量?
【发布时间】:2015-07-22 10:33:08
【问题描述】:

在 C++ 中,我了解到静态链接全局变量在程序启动时创建并在程序结束时销毁。如果变量在程序结束时被破坏(不是文件),我认为肯定有办法在其他文件中使用它。我想知道怎么做。

【问题讨论】:

  • ~stackoverflow.com/questions/2841762/… 的副本,它也提供了关于范围界定的良好、一般性建议。
  • 那是完全不同的问题。我要求一个技巧(如果存在)使我的静态变量可以在我的相关项目文件中访问。
  • 答案是响亮的、有增无减的NO。您不能在定义它们的文件之外访问static 变量。句号。这不是一个“完全”不同的问题。 OP 尝试按照您的要求进行操作,并想知道为什么它不起作用。因为它是故意不应该工作的
  • 是的...答案是相对的。但问题是问别的东西。我的不能称为重复的。
  • 你混淆了两种不同的东西。 全局变量在程序启动时创建。 static 变量不能从其范围之外访问。但是除了原则上不赞成全局变量之外,没有指定初始化的顺序,因此您可能会遇到一些麻烦。最重要的是,是的,你可以这样做,不,你不应该这样做。

标签: c++ global-variables c++14 static-variables linkage


【解决方案1】:

static 有多种含义。

使用static 在文件范围内声明的变量仅对该文件中的函数可见。您不能使用在另一个文件中定义的 static 变量。

听起来你想要一个普通的全局变量。不用static

在函数范围内声明的“局部”变量具有默认的“自动”生命周期——它们的值仅在函数执行期间持续存在,一旦函数返回,该值就消失了。您可以将其更改为与static 一起使用的程序。

【讨论】:

  • @ Jonathon Reinhart 那么这还有什么其他含义。保留 static 关键字使其成为外部变量,非 const 外部变量被认为是危险的。我想知道我是否可以让一个静态变量跨多个文件访问。
  • 正在要求“危险”(更像是不推荐的)行为。
【解决方案2】:

如果变量在标头中定义,只需包含标头并使用它。如果它在编译模块(即 .cpp 文件)中全局声明,则声明它的外部版本并使用它。请注意,这 不是静态的,这意味着内部链接明确地将变量的范围缩小到单个编译单元。这是全局/外部链接。

例如

模块1.cpp

int globalX = 5;

模块2.h

extern int globalX;

模块2.cpp

std::cout << globalX;

自从我做了很多 C++ 以来已经有一段时间了,但我相信这应该可行。

【讨论】:

  • 请。编码并编译它。 extern static 毫无意义。没有“静态全局”这样的东西。 static 明确地的意思是“对其他编译单元不可见!如果你不相信我,请参阅stackoverflow.com/questions/2841762/…
  • @SandyChapman 您所做的只是删除了 static 关键字。您的答案仍然是 "If it's declared globally static in a compilation module (i.e. .cpp file), then declare an extern version of it and use it.",这是 100% 不正确的。您在变量名中还有误导性的static!你现在正在拉扯每个人的锁链。
  • 我知道人们会得到错误的答案 - 每个人偶尔都会发生这种情况。但是投票和接受错误答案是不负责任的,尤其是在测试如此微不足道的情况下。在 Stack Overflow 等备受推崇的网站上,负责任的做法是接受您的错误并删除您的答案。 (我以前做过。)
  • 我已经继续并调整了答案,希望它实际上是正确的,即使它没有准确地回答问题。
  • @DevashishJaiswal 使用头文件不是“技巧”。如果你将static int x 放在头文件中,你做错了。这将导致多个不相关的变量存在,所有变量都命名为x;每个包含所述头文件的cpp 文件中的一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2021-02-25
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多