2012-11-14 124 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

(当然,还有一个事实,即你确切的代码是未定义行为,因为它包含一个下划线跟着一个大写字母开头的象征。 ) –

相关问题