给出以下代码:如何知道const数组的大小?
const myStr codesArr[] = {"AA","BB", "CC"};
myStr的是一类包装char*
。 我需要遍历数组中的所有项目,但我不知道项目的数量。 我不想定义const
值将代表(在这种情况下3)
是否可以安全使用类似大小:
const int size = sizeof(codesArr)/sizeof(myStr);
怎么办?
给出以下代码:如何知道const数组的大小?
const myStr codesArr[] = {"AA","BB", "CC"};
myStr的是一类包装char*
。 我需要遍历数组中的所有项目,但我不知道项目的数量。 我不想定义const
值将代表(在这种情况下3)
是否可以安全使用类似大小:
const int size = sizeof(codesArr)/sizeof(myStr);
怎么办?
您可以使用int size = sizeof(codesArr)/sizeof(myStr);
只要你不把它作为参数传递给函数,因为那么阵列将衰变成一个指针,失去尺寸信息。
您也可以使用模板招:
template<typename T, int sz>
int size(T(&)[sz])
{
return sz;
}
的安全和清晰的方式来做到这一点是使用std::extent
(因为C++ 11):
const size_t size = std::extent<decltype(codesArr)>::value;
最好的办法( 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,是允许您使用操作的结果作为另一个数组的大小(因为它是一个编译时间常数
这是怎么回事?这是模板参数推导的直接用法。 (如果你想费解的模板技巧,多看一些Boost源代码。) –
(当然,还有一个事实,即你确切的代码是未定义行为,因为它包含一个下划线跟着一个大写字母开头的象征。 ) –
这个问题是不是C或C++?对c的唯一方法++我真的会推荐使用'std :: array'(或者'std :: tr1 :: array',如果你的com piler不是C++ 11)而不是内置数组。并有可能使用'的std :: string',而不是什么'myStr'不 – Grizzly
可选,你也做'的sizeof(codesArr)/的sizeof(codesArr [0]);',与Luchian格里戈里提到的限制。 –