3 回答

TA貢獻1784條經驗 獲得超8個贊
通常,在其他答案中描述的技術被封裝在宏中以使其更容易在眼睛上。就像是:
#define COUNT_OF( arr) (sizeof(arr)/sizeof(0[arr]))
請注意,上面的宏使用了一個小技巧,即將數組名稱放在索引運算符(' []')中而不是0- 如果宏在C ++代碼中錯誤地使用了一個重載項,則會這樣做operator[]()。編譯器會抱怨而不是給出錯誤的結果。
但是,請注意,如果您碰巧傳遞指針而不是數組,宏將默默地給出錯誤的結果 - 這是使用此技術的主要問題之一。
我最近開始使用我從Google Chromium的代碼庫中竊取的更復雜的版本:
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
在這個版本中,如果指針被錯誤地作為參數傳遞,編譯器會在某些情況下抱怨 - 特別是如果指針的大小不能被指針所指向的對象的大小整除。在這種情況下,除零將導致編譯器出錯。實際上至少有一個我用過的編譯器給出了一個警告而不是一個錯誤 - 我不確定它為那個除以零的表達式生成了什么。
那個宏沒有關閉錯誤地使用它的大門,但是它就像我在直接看到的那樣接近。
如果您想在C ++中工作時使用更安全的解決方案,請查看Compile time sizeof_array,而不使用描述Microsoft使用的相當復雜的基于模板的方法的宏winnt.h。

TA貢獻1796條經驗 獲得超4個贊
不,那里沒有。
對于常量大小的數組,你可以使用Andrew提到的常用技巧,sizeof(array) / sizeof(array[0])但這只適用于聲明數組的范圍。
sizeof(array)給出整個數組sizeof(array[0])的大小,同時給出第一個元素的大小。
請參閱Michaels關于如何將其包裝在宏中的答案。
對于動態分配的數組,您可以跟蹤整數類型的大小,或者在可能的情況下使其以0結尾(即分配1個元素并將最后一個元素設置為0)。

TA貢獻1797條經驗 獲得超4個贊
數組中的元素數量x可以通過以下方式獲得:
sizeof(x)/sizeof(x[0])
您需要注意,數組在傳遞給函數時會降級為不帶大小信息的指針。實際上,大小信息永遠不可用于運行時,因為它是在編譯時計算的,但是您可以在數組可見的情況下(即,它尚未降級的情況下)可用。
當我將數組傳遞給我需要作為數組處理的函數時,我總是確保傳遞兩個參數:
陣列的長度; 和
指向數組的指針。
因此,雖然可以將數組視為聲明它的數組,但它在其他地方被視為大小和指針。
我傾向于使用以下代碼:
#define countof(x) (sizeof(x)/sizeof(x[0]))
: : :
int numbers[10];
a = fn (countof(numbers),numbers);
然后fn()將獲得它的大小信息。
我過去使用的另一個技巧(在我看來有點混亂,但我會在這里給它完整性)是有一個聯合數組并使第一個元素成為長度,如:
typedef union {
int len;
float number;
} tNumber;
tNumber number[10];
: : :
number[0].len = 5;
a = fn (number);
然后fn()可以訪問長度和所有元素,你不必擔心數組/指針二分法。
這具有允許長度變化的附加優點(即,使用中的元素的數量,而不是分配的單元的數量)。但我傾向于不再使用它,因為我認為兩個參數的數組版本(大小和數據)更好。
- 3 回答
- 0 關注
- 777 瀏覽
添加回答
舉報