C++ - 在一个 function/file 中初始化变量然后在 main()/另一个文件中使用它的最佳方法是什么?

C++ - what's the best way to initialize a variable in one function/file and then use it in main()/another file?

在 C++ 中,假设我需要给一个变量赋值,我想在 main() 之外进行,这样代码更清晰,但我想在 main() 内部使用该变量进行一些操作或其他功能。例如我有:

int main()
{
int a = 10;
int b = 20;
SomeFunction(a,b);
}

我想要这样的东西:

void Init()
{
int a = 10;
int b = 20;
}

int main()
{
SomeFunction(a,b);
}

但显然编译器会说 a 和 b 在 main() 的范围内未声明。我总是可以将它们声明为全局变量,但可能有更好的方法来解决这个问题,我读到全局变量在 long 运行 中并不是那么好。我不想使用 类。那么你们有什么建议呢?

使用结构:

struct data
{
    int x;
    int y;
};

data Init()
{
    data ret;
    ret.x = 2;
    ret.y = 5;
    return ret;
}

int main()
{
    data v = Init();
    SomeFunction(v.x, v.y); //or change the function and pass there the structure
    return 0;
}

如果您甚至不想使用结构,那么您可以通过引用将值传递给 Init 函数。但是我觉得第一个版本更好。

void Init(int &a, int &b)
{
    a = 5;
    b = 6;
}

int main()
{
    int a, b;
    Init(a, b);
    return 0;
}

您可以使用 extern 关键字。它允许变量定义一次,然后到处使用。你可以这样使用它:

// main.cpp

extern int a;
extern int b;

并在您的其他文件中执行

// Other.cpp

int a = 10;
int b = 20;

您可以用 extern 多次声明它们,但您只能定义一次。

您可以阅读更多关于 extern here

根据具体情况,您可能希望将这些变量的值存储在一个文件中,并在需要时从磁盘中读取它们。例如,您可以有 data_values.txt,其中有 space 个分隔的整数:324 26 435 ....

然后在另一个源文件中定义一个文件读取函数,比如说data_reader.cpp:

#include<fstream>
#include<string>
#include<vector>

std::vector<int> get_data(const std::string& file_name){
  // Initialize a file stream
  std::ifstream data_stream(file_name);

  // Initialize return
  std::vector<int> values;

  // Read space separated integers into temp and add them to the back of
  // the vector.
  for (int temp; data_stream >> temp; values.push_back(temp)) 
  {} // No loop body is necessary.

  return values;
}

在您想使用该功能的任何文件中,输入

#include <string>
#include <vector>
// Function declaration
std::vector<int> get_data(const std::string& file_name);
// File where the data is stored
const std::string my_data_file {"data_values.txt"};

void my_function() {
... // do stuff here
std::vector<int> data_values = get_data(my_data_file);
... // process data
}

如果您也避免使用 C++ 标准库中的 类,那么您可能希望对 return 值使用 int 数组,对文件使用 char* 或 char 数组name 和 scanf 或其他一些用于读取文件的 C 函数。