給出以下代碼:如何知道const數組的大小?
const myStr codesArr[] = {"AA","BB", "CC"};
myStr的是一類包裝char*
。 我需要遍歷數組中的所有項目,但我不知道項目的數量。 我不想定義const
值將代表(在這種情況下3)
是否可以安全使用類似大小:
const int size = sizeof(codesArr)/sizeof(myStr);
怎麼辦?
給出以下代碼:如何知道const數組的大小?
const myStr codesArr[] = {"AA","BB", "CC"};
myStr的是一類包裝char*
。 我需要遍歷數組中的所有項目,但我不知道項目的數量。 我不想定義const
值將代表(在這種情況下3)
是否可以安全使用類似大小:
const int size = sizeof(codesArr)/sizeof(myStr);
怎麼辦?
您可以使用int size = sizeof(codesArr)/sizeof(myStr);
只要你不把它作爲參數傳遞給函數,因爲那麼陣列將衰變成一個指針,失去尺寸信息。
您也可以使用模板招:
template<typename T, int sz>
int size(T(&)[sz])
{
return sz;
}
的安全和清晰的方式來做到這一點是使用std::extent
(因爲C++ 11):
const size_t size = std::extent<decltype(codesArr)>::value;
最好的辦法( pre C++ 11)獲取數組的大小在this link處給出。這是一個令人費解的模板招,但擁有如在上面的鏈接中討論的其他方法的許多優點。該方法是使用下面的宏+功能:
template <typename T, size_t N>
char (&_ArraySizeHelper(T (&array)[N]))[N];
#define countof(array) (sizeof(_ArraySizeHelper(array)))
它的優點,除其他外,是,它是一個純粹的編譯時操作,這比在運行時做的更好,而且,前C++ 11的constexpr,是允許您使用操作的結果作爲另一個數組的大小(因爲它是一個編譯時間常數
這是怎麼回事?這是模板參數推導的直接用法。 (如果你想費解的模板技巧,多看一些Boost源代碼。) –
(當然,還有一個事實,即你確切的代碼是未定義行爲,因爲它包含一個下劃線跟着一個大寫字母開頭的象徵。 ) –
這個問題是不是C或C++?對c的唯一方法++我真的會推薦使用'std :: array'(或者'std :: tr1 :: array',如果你的com piler不是C++ 11)而不是內置數組。並有可能使用'的std :: string',而不是什麼'myStr'不 – Grizzly
可選,你也做'的sizeof(codesArr)/的sizeof(codesArr [0]);',與Luchian格里戈裏提到的限制。 –