17

给出以下代码:

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

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

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

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

该怎么办?

4

3 回答 3

36

执行此操作的安全且清晰的方法是使用std::extent(C++11 起):

const size_t size = std::extent<decltype(codesArr)>::value;
于 2012-11-14T09:08:03.940 回答
19

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

您还可以使用模板技巧:

template<typename T, int sz>
int size(T(&)[sz])
{
    return sz;
}
于 2012-11-14T09:01:33.040 回答
1

此链接给出了获取数组大小的最佳方法(pre c++11)。这是一个复杂的模板技巧,但与上面链接中讨论的其他方法相比具有许多优点。方法是使用下面的宏+函数:

template <typename T, size_t N>
char ( &_ArraySizeHelper( T (&array)[N] ))[N];

#define countof( array ) (sizeof( _ArraySizeHelper( array ) ))

除其他外,它的优点是它纯粹是一个编译时操作,比在运行时执行它要好,并且在 c++11 的 constexpr 之前,它是唯一允许您将操作结果用作的方法另一个数组的大小(因为它是一个编译时间常数

于 2012-11-14T09:19:24.860 回答