chromium中求定长数组个数的写法

最近在chromium的代码里面发现了一个有意思的求写法数组个数的写法

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

#define arraysize(array) (sizeof(ArraySizeHelper(array)))

传统的做法就是

#define(array) sizeof(array) / sizeof(array[0])

 

据官方的说法的优点是,就是能在编译时判断array是不是定长数组,而不是指针。而明显传统的就不能了。

 

ArraySizeHelper事实上就是一个模版函数的定义。
这个函数就是输入一个定长数组引用,返回一个定长char数组的引用。

有两点需要明确:

(1) 数组的引用 跟 指向数组的指针 是两个不同的概念,数组的引用就代表整个数组,指针是这个数组的首地址

(2) 如下面函数

char (&xx())[1024]
{
	static char yy[1024];
	return yy;
}

就是返回一个定长数组。(PS: 我相信大部分人不知道可以这样写,一般也不会写这样的函数。)

 

这样arraysize就能根据传入的参数和模版生成对应的函数,而这个函数正是返回char (&)[N],这样就能用sizeof判断个数了。

以此同时,模版函数的参数检验了是否定长数组。

posted @ 2012-02-21 21:21  yanjielong  阅读(458)  评论(0编辑  收藏  举报