【问题标题】:assign array size with external global variable c++用外部全局变量 c++ 分配数组大小
【发布时间】:2023-04-09 11:54:01
【问题描述】:

我有以下简单的示例代码:

1.

//param.h
extern int n;

2.

//param.cpp
int n =10;

3.

# include <iostream>
# include "param.h"
using namespace std;
int main()
{
    double Arr[n];
    return 0;
}

它不能编译,因为我不能 n 没有定义。

为什么,在保持相同结构的同时解决此问题的最佳方法是什么?

【问题讨论】:

  • 考虑std::vector

标签: c++ global-variables


【解决方案1】:

两件事:首先,您需要链接从源代码生成的所有目标文件。第二个是variable-length arrays 不是有效的 C++ 构造。

要解决第一个问题,您需要确保编译两个源文件。可以在命令行上一起使用,也可以分成单独的目标文件,然后将它们链接在一起形成可执行文件。

第二个问题可以通过在声明和定义中使用const关键字使其成为编译时常量来解决。

【讨论】:

    【解决方案2】:

    n 是非常量的:您不能使用n 作为大小来声明静态数组。正如@NickyC 在 cmets 中指出的那样,简单的解决方案是将数组替换为std::vector

    #include <vector>
    
    std::vector<double> Arr(n/*, default_value*/);
    

    如果您想继续使用数组,则必须将 n 声明为 const:

    // param.h
    extern const int n;
    
    // param.cpp
    const int n = 10;
    

    或声明一个动态数组:

    double* Arr = new double[n];
    ...
    delete[] Arr;
    return 0;
    

    或更好的托管指针:

    #include <memory>
    
    std::unique_ptr<double[]> Arr = std::make_unique<double[]>(n);
    

    【讨论】:

      【解决方案3】:

      声明中的变量n

      double Arr[n];
      

      应该是编译时已知的常量。

      在param.h中,可以声明

      constexpr int n = 10;
      

      并从 param.cpp 中抑制它。

      如果 n 本质上是一个变量,另一种解决方案是保留您定义的文件参数,并使用 alloca 在堆栈上分配数组 Arr。

      你也可以用

      在堆中分配Arr
       double* Arr = new double[n];
      

      但你应该在函数末尾用 delete [] Arr; 删除它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-18
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        • 2012-08-12
        相关资源
        最近更新 更多