如何知道常量数组的大小

How to know the size of a const array?

本文关键字:数组 何知道 常量      更新时间:2023-10-16

给定以下代码:

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

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

使用以下内容是否安全:

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

怎么办?

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

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

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

您还可以使用模板技巧:

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

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

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

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