先請(qǐng)各位看看代碼,思考一下,這里的代碼是做什么的?
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)))

int a[10]
int size = arraysize(a);//這里能夠求出a的大小

這個(gè)代碼比普通的sizeof(a)/sizeof(int)更安全,它避免了我們做這樣的操作:
int a[10]
int *= a;

int size = arraysize(p);//不可行
size = arraysize(a);//可行
利用模板獲得一個(gè)數(shù)組的引用,返回對(duì)應(yīng)的char類型的數(shù)組引用再對(duì)char類型的數(shù)組求大小,不用求sizeof(T),代替了了除法運(yùn)算和兩次求值sizeof(),不知道這個(gè)會(huì)不會(huì)影響編譯時(shí)的效率
template <typename T, size_t N>
char (*ArraySizeHelper(const T (&array)[N]))[N];
#define arraysize(array) (sizeof(*ArraySizeHelper(array)))
據(jù)waiting4you的評(píng)論,也可以這樣做: 
對(duì)于老的編譯器,不允許返回?cái)?shù)組的引用,但是返回指針數(shù)組應(yīng)該是沒有問題的,入口參數(shù)傳遞數(shù)組的引用也沒有問題