コード スニペットが必要とする機能は、可変長配列(VLA) と呼ばれます。C または C++ 言語でのこの機能のサポートは、コンパイラと標準のバージョンによって異なります。
- C99 は、VLA を標準でサポートしています。
- C99 より前のバージョン (C90 を含む) は VLA を標準としてサポートしていませんが、一部のコンパイラは言語拡張機能として VLA を実装している場合があります。
- C11 では、VLA がオプション機能になります。
- C++14 は、動的配列と呼ばれる VLA の制限付きバリアントをサポートしています。
- C++14 より前のバージョン (C++11、C++03、および C++98 を含む) は、VLA を標準としてサポートしていませんが、一部のコンパイラは VLA を拡張機能として実装する場合があります。
特に、GCC は C90 および C++ の言語拡張として VLA を実装しており、明らかに www.compileonline.com はコンパイラとして GCC を使用しています (この記事の執筆時点ではバージョン 4.7.2)。VLA を実装する Visual C++ コンパイラのバージョンはありません。
Herb Sutter が C++14 の動的配列機能について語っています。
この言語では、ドラフト C++14 で、スタックベースの配列のサイズを実行時に決定できるようになりました。
void f(std::size_t n)
{
int a[n];
...
}
これは C99 の可変長配列 (VLA) と同じではないことに注意してください。また、C11 標準では VLA が条件付きでサポートされるようになったため、適合する C コンパイラで必要な移植可能な C の一部ではなくなりました。特に、C++ は、C++ が望ましくないと感じている C99 VLA の次の機能を明示的にサポートしていません。
- 多次元配列。トップ レベル以外にランタイム バウンドがあります (同様に、新しい式の配列形式もそれをサポートしていません)。
- 関数宣言構文の変更
sizeof(a)
のサイズを返すランタイム評価式であるa
typedef int a[n];
それを評価n
して typedef に渡す
ほとんどすべてのバージョンの C++ で動作する C++ コードが必要な場合は、std::vector
代わりに次の使用を検討してください。
#include <vector>
int main()
{
int var = function(a); // Assume function() has been defined.
std::vector<int> num(var); // Creates a vector with var number of elements.
// ...
int num1 = num[1]; // You can access elements in vectors just like arrays.
num[1] += 10;
// ...
}