【问题标题】:c++ Is 'static int' not working across multiple files?c ++'static int'不能跨多个文件工作吗?
【发布时间】:2015-05-25 17:17:01
【问题描述】:

为了向您展示,我做了一个关于 1 个标头和 2 个 .cpp 文件的问题的极简示例。我所做的只是调用myfunc(),这将获得cin>> 的值。然后 main 将打印值 (+3)。我收到 main.cpp 的错误“a 未定义”。 我认为static 在这里有所帮助,但事实并非如此。我不明白问题是什么。

(我知道,我可以写cout << myfunc()+3;,但这是出于一般目的)。

header.h:

#ifndef header_h
#define header_h

int myfunc();

#endif

main.cpp:

#include <iostream>
#include "header.h"

int main()
{
    myfunc();

    std::cout << a + 3 << std::endl;
}

second.cpp:

#include"header.h"

int myfunc()
{
    static int a;
    std::cin >> a;
    return a;
}

【问题讨论】:

  • 顺便说一句,您很少会做与您似乎正在尝试做的事情类似的事情——如果您发布了一个不同的问题来解释您通过编写这样的代码试图解决什么问题,您一定会得到有关解决问题的更好方法的建议。
  • @Hurkyl ty,我记住了! =) 但那是我的意图。我不想让其他人直接解决任何问题。尽管我会很感激,但我仍然尝试自己解决问题。

标签: c++ function static declaration


【解决方案1】:

您的 a 变量在函数内部声明(因此它在范围内是本地的),因此无法在其外部访问。 如果要从 main 访问,请将其声明在函数范围之外(全局变量)。

int f() {
    int x = 23 ;
    return x ;
}

int main() {
    std::cout << f() << std::endl ;
    std::cout << x ; // Error! x is local to f() and there is no x declared globally or inside main()'s scope.
}

你可以这样做:

int a = myfunc();
std::cout << a ; // Now possible!

编辑:static 变量声明与范围规则或可访问性无关。声明static 仅意味着变量的生命周期策略的更改,即它的生命周期是在整个程序执行期间,而不是在范围内(声明变量)中的指令被执行的期间。因此,声明static 并不意味着可以在其范围之外访问变量。

【讨论】:

  • 但正是出于这个原因,我将a 声明为static。我认为它在函数之后仍然保持值。但是..这与编译器无关吗? main.cpp 本身是否需要一个 a 声明? (当我将int a 放在 header.h 中时,它也不起作用)。
  • 静态并不意味着从任何地方访问。 static 意味着它将在程序的整个生命周期中都存在但是,它只能在声明的范围内以及该范围内包含的内部范围内访问。
  • 啊,非常喜欢!那是我学到的一件事,即不能在声明范围之外访问静态(我认为关于静态的唯一事情是它不能在范围之外重写。TY!) .但是,在我的代码a 中,(以及你的代码x,你完全明白了我的问题)我并没有真正尝试访问a,是吗?我的意思是,我明确地将a 返回到 myfunc() 等到 main.cpp。
  • (我可能会看到我的理解问题:是否在编译时 每个 函数都需要声明范围内使用的 every 变量?所以main.cpp 无法真正预见到会从 second.cpp 中得到a?!!)
  • 哇...尴尬级别 9000。当然我正在尝试通过cout &lt;&lt; a+3 直接访问a ...我以某种方式认为,当我通过函数返回一个值时,它很简单以下所有其他人都知道......由于漫长的日子,我试图原谅的愚蠢错误......感谢您的耐心和帮助......!
【解决方案2】:

"static" 做了两件事:它创建一个在程序的生命周期中只存在一次的变量,并确保该变量只能在定义它的一个编译单元中通过名称访问(所以如果另一个编译单元偶然声明了具有相同名称的静态内容,没有冲突)。

这意味着根据设计,您不能从 main.cpp 访问在 second.cpp 中声明的静态变量。这绝对是故意的。

此外,您的变量 a 是在函数内声明的。这意味着它只能在该函数内部访问。因此,即使 second.cpp 中其他函数中的代码也无法通过名称访问它。再次,完全是故意的。

除此之外,如果您解决了这些问题(并且您可以),将函数的结果存储在全局变量中并通过该变量访问它通常被认为是一种非常糟糕的编程习惯。

【讨论】:

  • 谢谢!!有趣的是,你帮我纠正了我对static 的看法。但是我没有另一个问题吗?我的意思是,我明确地将a 返回到 myfunc() 以及 main.cpp。还是这等于直接访问a,所以我的代码不起作用?!
  • 哇...尴尬级别 9000。当然,我试图通过cout &lt;&lt; a+3 直接访问a ...我不知何故认为,当我通过函数返回一个值时,这很简单以下所有其他人都知道......由于漫长的日子,我试图原谅的愚蠢错误......感谢您的耐心和帮助......!
猜你喜欢
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多