[英]assign array size with external global variable 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;
}
它沒有編譯,因為我不能定義n。
為什么,在保持相同結構的同時解決這個問題的最佳方法是什么?
兩件事:首先,您需要鏈接從源生成的所有目標文件。 第二個是變長數組不是有效的C ++結構。
要解決第一個問題,您需要確保編譯兩個源文件。 在命令行上,或者在鏈接在一起形成可執行文件的單獨目標文件中。
第二個問題可以通過在聲明和定義中使用const
關鍵字來解決,使其成為編譯時常量。
n
是非const:您不能使用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);
聲明中的變量n
double Arr[n];
應該是編譯時已知的常量。
在param.h中,您可以聲明
constexpr int n = 10;
並從param.cpp中抑制它。
如果n本質上是一個變量,另一個解決方案是保存文件params,就像你定義它一樣,並使用alloca在堆棧上分配你的數組Arr。
您也可以在堆中分配Arr
double* Arr = new double[n];
但你應該在函數的末尾用delete [] Arr刪除它;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.