<!--lang: cpp-->
#arraysize
arraysize(arr)宏返回一个数组元素的个数,这个表达式是编译时常量,因此可以用来定义新的数组。如果传给arraysize一个指针,编译时会报错。
ArraySizeHelper是一个返回类型为char[N]的函数,其形参类型为 T[N]。
sizeof只关心类型,不需要对表达式求值,因此ArraySizeHelper不需要具体的实现。
template<typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
arraysize() 不支持匿名类型(anonymous type)和在函数中定义的类型(a type defined inside a function),这是由于C++的模板机制所限制。在这种情况下需要使用非类型安全的ARRAYSIZE_UNSAFE()宏.
这个宏并不完美, 会错误的接受一些指针(指针大小可以整除元素大小)。
在32位平台上, 指针大小是4字节, 小于3或者大于4字节的指针类型都会报错。
#define ARRAYSIZE_UNSAFE(a) \
((sizeof(a)/sizeof(*(a))) / \
static_cast<size_t>(!(sizeof(a)%sizeof(*(a)))))
#数组引用
类型名 (&变量明)[N];
int &ary[] ary首先向右结合,所以这个相当于 (int&)ary[] ary是个数组,其中的元素是引用。不过这个是非法的。 int (&ary)[10] ary首先和&结合,所以ary是引用,引用的对象是数组。
数组的引用可以避免指针的退化,并且通过传递数组引用的参数来限制数组的大小
#参考
1.http://bbs.csdn.net/topics/340181236 2.x-framework.googlecode.com/svn/trunk/library/base/basic_types.h