我想聲明我的方法頂部的陣列,但它不是編譯:C++:如何在方法的頂部聲明一個數組?
Foo Bar()
{
int arr[]; // C2133
// …
// C2059, C2143, C2143
arr[] = {1, 2, 3};
}
什麼我錯在這裏做什麼?
UPDATE我知道C++並不強迫我這樣做,但項目的約定要求在方法頂部聲明所有變量。
我想聲明我的方法頂部的陣列,但它不是編譯:C++:如何在方法的頂部聲明一個數組?
Foo Bar()
{
int arr[]; // C2133
// …
// C2059, C2143, C2143
arr[] = {1, 2, 3};
}
什麼我錯在這裏做什麼?
UPDATE我知道C++並不強迫我這樣做,但項目的約定要求在方法頂部聲明所有變量。
當您在C/C++中聲明數組時,您需要指定大小。如果不指定大小,則需要在同一個聲明語句中定義數組元素,如下所示:
int arr[] = {1, 2, 3};
如果您不知道數組的大小並且無法在聲明中指定元素,則需要使用指針並動態分配內存,但這是另一個問題的主題。 – 2010-07-02 00:16:17
如果你帶着指針走,你會失去執行神奇的「= {1,2,3}」的能力,對吧? – 2010-07-02 00:33:53
@Owen右。實際上,如果你在初始化時沒有這樣做,即使數組是在固定大小的棧上聲明的(例如'int arr [3]; arr = {1,2,3} ;'不合法)。該大括號語法僅適用於初始化,不適用於分配。 – 2010-07-02 02:55:46
這只是無效的語法。如果你想要做arr = { ... };
,它必須是你聲明變量的時候。但是C++不會強制你在函數的開頭聲明變量,所以你可以這樣做:
Foo Bar() {
// other stuff goes here
// ...
int arr[] = {1, 2, 3};
}
你不能。無論是項目的慣例需要給,或者您的初始化代碼:
Foo Bar() {
int a[3];
...
a[0] = 1;
a[1] = 2;
a[2] = 3;
}
什麼項目約定,要求你聲明非特定數組的大小,而不是初始化它們? – YeenFei 2010-07-02 01:34:30
我在這段時間看到過一些瘋狂的約定,但從來沒有強迫你編寫無效代碼的約定。 – 2010-07-02 01:52:41
一個好的編碼慣例需要相反的,在需要而不是更早的地方聲明一個變量。 – starblue 2010-07-03 18:53:42