来自chrome的arraysize

<!--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

转载于:https://my.oschina.net/u/1581994/blog/268364

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值