C++ 如何知道常量数组的大小?

C++ 如何知道常量数组的大小?,c++,c,arrays,sizeof,C++,C,Arrays,Sizeof,给定以下代码: const myStr codesArr[] = {"AA","BB", "CC"}; myStr是一个包装char*的类。 我需要循环数组中的所有项目,但我不知道项目的数量。 我不想定义表示大小的const值(在本例中为3) 使用以下物品是否安全: const int size = sizeof(codesArr) / sizeof(myStr); 怎么办?您可以使用int size=sizeof(codesar)/sizeof(myStr)只要不将其作为参数传

给定以下代码:

const myStr codesArr[] =  {"AA","BB", "CC"};     
myStr是一个包装
char*
的类。 我需要循环数组中的所有项目,但我不知道项目的数量。 我不想定义表示大小的
const
值(在本例中为3)

使用以下物品是否安全:

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

怎么办?

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

您还可以使用模板技巧:

template<typename T, int sz>
int size(T(&)[sz])
{
    return sz;
}
模板
整数大小(T(&)[sz])
{
返回sz;
}

安全而清晰的方法是使用(从C++11开始):

const size\u t size=std::extent::value;
获取数组大小的最佳方法(c++11之前)在中给出。这是一个复杂的模板技巧,但与上面链接中讨论的其他方法相比,它有许多优点。方法是使用以下宏+函数:

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

#define countof( array ) (sizeof( _ArraySizeHelper( array ) ))
模板
char(&_ArraySizeHelper(T(&array)[N]))[N];
#定义countof(数组)(sizeof(_ArraySizeHelper(数组)))

它的优点之一是纯粹的编译时操作,这比在运行时操作要好,而且在c++11的constexpr之前,是唯一允许您使用操作结果作为另一个数组大小的方法(因为它的<强>编译时常数<或强> /p>是C或C++的问题吗?对于C++,我真的推荐使用<代码> STD::数组< /C>(或者<代码> STD::Tr1::CalpUs/Coe>如果编译器不是C++ 11)而不是内置数组。并且可能使用
std::string
而不是
myStr
执行的任何操作。您也可以执行
sizeof(codesar)/sizeof(codesar[0])
,带有Luchian Grigore提到的限制。sizeof返回一个size\u t,但我们都将它与int一起使用。它工作是因为隐式转换吗?@Maroun85是的,存在隐式转换(不是转换本身)。只要大小可以表示为int,此转换不会导致任何问题。您的
size()
函数应该是C++11中的
constexpr
,或者在C++03中使用宏技术,这样它就可以用作常量表达式。@Nawaz不可能;
constexpr
函数只能有文本类型参数,即使它们不被使用。@ecatmur:哦,我不知道。无论如何,在这种情况下,宏技术就是解决方法。怎么回事这是一个模板参数推断的简单用法。(如果你想使用复杂的模板技巧,请查看一些Boost源代码。)(当然,事实上,你的确切代码有未定义的行为,因为它包含一个以下划线开头,后跟大写字母的符号。)
template <typename T, size_t N>
char ( &_ArraySizeHelper( T (&array)[N] ))[N];

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