在chromium中有计算数组长度的宏 arraysize
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
// That gcc wants both of these prototypes seems mysterious. VC, for
// its part, can't decide which to use (another mystery). Matching of
// template overloads: the final frontier.
#ifndef _MSC_VER
template <typename T, size_t N>
char (&ArraySizeHelper(const T (&array)[N]))[N];
#endif
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
在win中也有类似的宏 _countof
#ifndef _countof
#define _countof(array) (sizeof(array)/sizeof(array[0]))
#endi
============================== 以下转载
1、数组的引用
T (&)[N] (注意:有个括号)。比如:
int a[5] = {0};
int (&ra)[5] = a; 这里ra就是一个对数组a的引用,其这个数组的大小也是5;
2、返回值为数组引用的函数
T (& Fun( param_list ) )[N];
Fun是一个函数,其返回值类型是 T (&)[N];
3、sizeof()在编译期完成,与运行时无关
sizeof是C/C++语言中的keyword,不是函数。对其参数里的表达式是不会在执行期去执行的,而只是在编译期去推算整个表达式的最后的类型信息。
比如: int a = 1; sizeof(a++); cout << a; // a还是1. 不会是2;
因为是在编译期完成,编译器只需要类型信息,不需要函数的实现体。所以就可以不用提供定义体。
下面这个例子可能更能说明这个问题。
int Fun(); // only declare it without definition
sizeof( Fun() ); // 这里Fun()函数不会在运行的时候被执行,仅仅是在编译时,编译器需要知道的是:Fun()函数返回值的类型是什么。
4、模板自动推导在编译期完成
模板推导是由编译器在编译期(compile time)完成的,而不是在执行期(run time)完成的。
这个是理解的关键之一。不涉及内存布局分配的问题。编译期间,编译器只关心声明信息(也就是声明式里面所带的类型信息)。模板推导会自动推导模板参数的各种信息(类型,传递过来的数值等)。以下是一个例子:
template<int x, int y>
struct sum_
{
enum { value = x + y };
};
int sum = sum_<3, 4>::value; // sum的值在编译期间就已经确定下来了,不是在执行期间由CPU运算得到。
这个例子里的模板,仅仅只有数值的传递,没有包含类型。这个可能大家很少见到的。但是模板是支持的。
所以
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
E.g: int atest[100] = {0}; int sz = arraysize(atest);
arraysize 接收一个数组array的引用,在编译器就知道了 T---> int, N---> 100; 返回了一个char型的数组,注意这里返回的必须是系统最小的字节单位,这里为char
当然了,unsinged char 也是可以的。