簡體   English   中英

使用外部全局變量c ++分配數組大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM