如何知道const数组的大小?

时间:2012-11-14 09:00:19

标签: c++ c arrays sizeof

给出以下代码:

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

myStr是一个包裹char*的类。 我需要遍历数组中的所有项目,但我不知道项目的数量。 我不想定义代表大小的const值(在本例中为3)

使用类似的东西是否安全:

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

该怎么办?

3 个答案:

答案 0 :(得分:30)

安全而明确的方法是使用std::extent(自C ++ 11起):

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

答案 1 :(得分:18)

只要不将它作为参数传递给函数,就可以使用int size = sizeof(codesArr) / sizeof(myStr);,因为这样数组会衰减成指针并丢失大小信息。

您还可以使用模板技巧:

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

答案 2 :(得分:1)

获得数组大小的最佳方法(前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 ,是唯一允许您将操作结果用作另一个数组的大小的方法(因为它的编译时常量