3 回答

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

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

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