计算固定数组中的元素数(类似于sizeof)

时间:2014-03-25 17:12:41

标签: c++ arrays sizeof typeof

我正在用C ++开发一个库,以便为开发人员提供一些帮助。 通常,为了以动态方式计算整数数组(例如)的大小(不使用#define SIZE或static int SIZE),我执行sizeof(v)/ sizeof(int)。我试着编写一段代码,可以自动为我做这些东西,我决定调用lengthof。 代码在这里:

template <class T> int _typesize(T*) { return sizeof(T); }
#define lengthof(x) (sizeof(x) / _typesize(&x))

我使用模板获取数组的类型,然后以字节为单位返回其大小。在GCC中我知道可以使用typeof,所以我可以用sizeof(typeof(x))替换_typesize(&amp; x),但在MSVC上它是不可能的。 _typesize是一种兼容的方式,但我认为它可能很昂贵,因为它将指针作为副本传递。有一种优雅的方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:6)

此任务不需要宏。如果你有一个符合标准的编译器

template<class T, size_t len>
constexpr size_t lengthof(T(&)[len]) {return len;}
//the parameter is an unnamed reference to a `T[len]`, 
//where `T` is deduced as the element type of the array
//and len is deduced as the length of the array.
//similar to `T(*)[len]` in C, except you can pass the array
//directly, instead of passing a pointer to it.
//added benefit that if you pass a `T*` to it, it produces a compiler error.

或者如果你正在使用尚未符合的Visual Studio ......

template<class T, size_t len>
std::integral_constant<size_t, len> lengthof(T(&)[len]) {return {};}
//VC++ doesn't have constexpr, so we have to use `std::integral_constant` instead :(
//but how it works is 100% identical

如果你想要一种更便携的方式,宏仍然效果最好:

#define lengthof(arr) sizeof(arr) / sizeof(arr[0])
//doesn't respect namespaces, evaluates arguments multiple times
//and if you pass a `T*` to it, it evaluates to `1` depending on context.

但重申我的评论,我会考虑所有这些糟糕的代码。使用std::vectorstd::array

答案 1 :(得分:3)

通常,您会使用:sizeof(x) / sizeof(x[0]),它不依赖于任何扩展程序。

答案 2 :(得分:3)

获取数组长度的规范C ++方法是sizeof(arr) / sizeof(arr[0])。是否要通过将其打包成宏来隐藏它是完全另一种争论。

作为旁注,如果您的_typesize位于全局命名空间中,则该名称将保留用于实现并且非法使用。在命名空间中,它在技术上是合法的,但一般来说,您可以通过完全避免引导下划线来避免保留名称问题。