Mic*_*urr 66
通常,在其他答案中描述的技术被封装在宏中以使其更容易在眼睛上.就像是:
#define COUNT_OF( arr) (sizeof(arr)/sizeof(0[arr]))
Run Code Online (Sandbox Code Playgroud)
请注意,上面的宏使用了一个小技巧,即将数组名称放在索引运算符(' []
')中而不是0
- 如果宏在C++代码中错误地使用了一个重载项,则会这样做operator[]()
.编译器会抱怨而不是给出错误的结果.
但是,请注意,如果您碰巧传递指针而不是数组,宏将默默地给出错误的结果 - 这是使用此技术的主要问题之一.
我最近开始使用我从Google Chromium的代码库中窃取的更复杂的版本:
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
Run Code Online (Sandbox Code Playgroud)
在这个版本中,如果指针被错误地作为参数传递,编译器会在某些情况下抱怨 - 特别是如果指针的大小不能被指针所指向的对象的大小整除.在这种情况下,除零将导致编译器出错.实际上至少有一个我用过的编译器给出了一个警告而不是一个错误 - 我不确定它为那个除以零的表达式生成了什么.
那个宏并没有关闭错误地使用它的大门,但是它就像我在直接看到的那样接近.
如果您想在C++中工作时使用更安全的解决方案,请查看Compile time sizeof_array,而不使用描述Microsoft使用的相当复杂的基于模板的方法的宏winnt.h
.
Geo*_*che 14
不,那里没有.
对于常量大小的数组,你可以使用Andrew提到的常用技巧,sizeof(array) / sizeof(array[0])
但这只适用于声明数组的范围.
sizeof(array)
给出整个数组sizeof(array[0])
的大小,同时给出第一个元素的大小.
请参阅Michaels关于如何将其包装在宏中的答案.
对于动态分配的数组,您可以跟踪整数类型的大小,或者在可能的情况下使其以0结尾(即分配1个元素并将最后一个元素设置为0).
sizeof array / sizeof array[0]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8654 次 |
最近记录: |