Mat*_*ner 32 c c++ arrays c-preprocessor
我已经看到了几个浮动数组长度的宏:
从这个问题:
#define length(array) (sizeof(array)/sizeof(*(array)))#define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0]))#define SIZE(array, type) (sizeof(array) / (sizeof(type))和Visual Studio的_countof:
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
我想知道的是:
array[0]和有*array什么区别?Mic*_*urr 63
这是一个更好的C版本(来自Google的Chromium项目):
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
它通过使用改进了array[0]或*array版本0[array],这相当于array[0]普通数组,但如果array碰巧是重载的C++类型,则无法编译operator[]().
对于许多(但不是全部)指针作为array参数传递的情况,除法会导致除零操作(应该在编译时捕获,因为它是编译时常量表达式).
请参阅C中是否存在可返回数组长度的标准函数?更多细节.
C++代码有更好的选择.有关详细信息,请参阅编译时使用sizeof_array而不使用宏.
Che*_*Alf 15
(1)C没有区别C++中的实际原始数组没有区别.
(2)没有技术理由偏好一个或另一个,但新手可能会被指针解除引用混淆.
(3)在C++中,你通常不会使用宏,因为它非常不安全.如果传入指针而不是实际的原始数组,代码将编译但产生不正确的结果.所以在C++中你应该/应该使用函数模板,比如...
#include <stddef.h>
typedef ptrdiff_t Size;
template< class Type, Size n >
Size countOf( Type (&)[n] ) { return n; }
这只接受实际的原始数组作为参数.
它是三个函数的一部分startOf,endOf并且countOf定义非常方便,以便它们可以应用于原始数组和标准库容器.据我所知,这个三合会最初是由Dietmar Kuehl确定的.在C++ 0x中startOf,endOf很可能是std::begin和std::end.
干杯&hth.,
| 归档时间: | 
 | 
| 查看次数: | 32988 次 | 
| 最近记录: |