2012-11-14 163 views
13

給出以下代碼:如何知道const數組的大小?

const myStr codesArr[] = {"AA","BB", "CC"};  

myStr的是一類包裝char*。 我需要遍歷數組中的所有項目,但我不知道項目的數量。 我不想定義const值將代表(在這種情況下3)

是否可以安全使用類似大小:

const int size = sizeof(codesArr)/sizeof(myStr); 

怎麼辦?

+2

這個問題是不是C或C++?對c的唯一方法++我真的會推薦使用'std :: array'(或者'std :: tr1 :: array',如果你的com piler不是C++ 11)而不是內置數組。並有可能使用'的std :: string',而不是什麼'myStr'不 – Grizzly

+0

可選,你也做'的sizeof(codesArr)/的sizeof(codesArr [0]);',與Luchian格里戈裏提到的限制。 –

回答

16

您可以使用int size = sizeof(codesArr)/sizeof(myStr);只要你不把它作爲參數傳遞給函數,因爲那麼陣列將衰變成一個指針,失去尺寸信息。

您也可以使用模板招:

template<typename T, int sz> 
int size(T(&)[sz]) 
{ 
    return sz; 
} 
+0

sizeof返回一個size_t,但我們都用int來使用它。 它是否因爲隱式投射而起作用? – Maroun

+1

@ Maroun85是的,有一個隱式轉換(本身不是演員表)。只要大小可以表示爲int,此轉換不會導致任何問題。 – nos

+1

你'尺寸()'函數應該是'constexpr'在C++ 11,或者使用宏技術在C++ 03,以便它可以被用作常量表達式。 – Nawaz

28

的安全和清晰的方式來做到這一點是使用std::extent(因爲C++ 11):

const size_t size = std::extent<decltype(codesArr)>::value; 
0

最好的辦法( 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,是允許您使用操作的結果作爲另一個數組的大小(因爲它是一個編譯時間常數

+0

這是怎麼回事?這是模板參數推導的直接用法。 (如果你想費解的模板技巧,多看一些Boost源代碼。) –

+3

(當然,還有一個事實,即你確切的代碼是未定義行爲,因爲它包含一個下劃線跟着一個大寫字母開頭的象徵。 ) –

相關問題