首页 > 解决方案 > C++主函数中变量的作用域是什么?

问题描述

假设我在 C++ 中有 main 函数,并声明了一个向量:

int main()
{
  vector<int> arr (10, 5);

  for (auto num : arr)
  {
    cout << num << endl;
  }
}

根据我对范围的理解,该变量可以从定义它的任何地方访问,一直到定义它的环境的右括号。所以在这里,arr 可以在 main() 中的任何地方访问,因此它在for 循环。

但是,现在说我定义了一个函数并在 main 中调用该函数。

int main()
{
  vector<int> arr (10, 5);
  func();
}

void func()
{
  arr.push_back(1);
}

现在,arr 在 func() 中是未定义的。我理解为什么会这样,因为严格来说,数组没有在 func() 范围内的任何地方定义。我意识到我们必须将 arr 作为参数传递给 func() 才能使其正常工作。但这与我对上面定义的范围的理解相冲突,在 main 中的任何地方都可以访问 arr,并且由于在 main 中调用了 func(),为什么它不能访问 arr?

补充:我已经在 J​​S 中开发了一段时间,所以我已经习惯了这种嵌套函数的模式:

function main() {
  let a = 5;
  function nested() {
    console.log(a)
  }
}

在这里, a 可以在嵌套函数中访问。

标签: c++

解决方案


在 C++ 中,变量的可见性{}在它被声明的地方。可以创建全局变量,但您需要在文件顶部声明它。如果要编写主体函数,首先需要告诉该函数将存在。

void func();
vector<int> arr (10, 5);
int main()
{
  func();
}

void func()
{
  arr.push_back(1);
}

编辑:

但这是一种不好的做法,建议使用参考。

void func(vector<int> &arr);

int main()
{
  vector<int> arr (10, 5);
  func(arr);
}

void func(vector<int> &arr)
{
  arr.push_back(1);
}

推荐阅读