2016-08-22 33 views
2

我有以下的簡單的例子的代碼:分配數組大小與外部全局變量C++

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; 
} 

它不編譯,因爲我不能不是d efined。

爲什麼在保持相同結構的同時解決此問題的最佳方法是什麼?

+6

考慮'std :: vector'。 –

回答

4

n非常量:不能聲明使用n作爲大小的靜態數組。作爲@NickyC在評論中指出,簡單的解決方法是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); 
6

有兩件事:首先你需要鏈接所有從源代碼生成的目標文件。第二個是variable-length arrays不是有效的C++構造。

要解決第一個問題,您需要確保您編譯兩個源文件。可以一起在命令行上,也可以將它們鏈接在一起以形成可執行文件。

第二個問題可以通過在聲明和定義中使用const關鍵字來解決,使其成爲編譯時常量。

4

在申報

double Arr[n]; 

變量n應該是在編譯時已知的常數。

在param.h,您就可以宣佈

constexpr int n = 10; 

和param.cpp抑制它。

如果n本質上是一個變量,另一個解決方案是保持文件參數,因爲您已經定義了它,並使用alloca來分配您的數組Arr在堆棧上。

您也可以在堆與

double* Arr = new double[n]; 

分配編曲但是你應該用delete []編曲功能結束刪除;