3 回答
TA贡献1784条经验 获得超8个赞
通常,在其他答案中描述的技术被封装在宏中以使其更容易在眼睛上。就像是:
#define COUNT_OF( arr) (sizeof(arr)/sizeof(0[arr]))
请注意,上面的宏使用了一个小技巧,即将数组名称放在索引运算符(' []')中而不是0- 如果宏在C ++代码中错误地使用了一个重载项,则会这样做operator[]()。编译器会抱怨而不是给出错误的结果。
但是,请注意,如果您碰巧传递指针而不是数组,宏将默默地给出错误的结果 - 这是使用此技术的主要问题之一。
我最近开始使用我从Google Chromium的代码库中窃取的更复杂的版本:
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
在这个版本中,如果指针被错误地作为参数传递,编译器会在某些情况下抱怨 - 特别是如果指针的大小不能被指针所指向的对象的大小整除。在这种情况下,除零将导致编译器出错。实际上至少有一个我用过的编译器给出了一个警告而不是一个错误 - 我不确定它为那个除以零的表达式生成了什么。
那个宏没有关闭错误地使用它的大门,但是它就像我在直接看到的那样接近。
如果您想在C ++中工作时使用更安全的解决方案,请查看Compile time sizeof_array,而不使用描述Microsoft使用的相当复杂的基于模板的方法的宏winnt.h。
TA贡献1796条经验 获得超4个赞
不,那里没有。
对于常量大小的数组,你可以使用Andrew提到的常用技巧,sizeof(array) / sizeof(array[0])但这只适用于声明数组的范围。
sizeof(array)给出整个数组sizeof(array[0])的大小,同时给出第一个元素的大小。
请参阅Michaels关于如何将其包装在宏中的答案。
对于动态分配的数组,您可以跟踪整数类型的大小,或者在可能的情况下使其以0结尾(即分配1个元素并将最后一个元素设置为0)。
TA贡献1797条经验 获得超4个赞
数组中的元素数量x可以通过以下方式获得:
sizeof(x)/sizeof(x[0])
您需要注意,数组在传递给函数时会降级为不带大小信息的指针。实际上,大小信息永远不可用于运行时,因为它是在编译时计算的,但是您可以在数组可见的情况下(即,它尚未降级的情况下)可用。
当我将数组传递给我需要作为数组处理的函数时,我总是确保传递两个参数:
阵列的长度; 和
指向数组的指针。
因此,虽然可以将数组视为声明它的数组,但它在其他地方被视为大小和指针。
我倾向于使用以下代码:
#define countof(x) (sizeof(x)/sizeof(x[0]))
: : :
int numbers[10];
a = fn (countof(numbers),numbers);
然后fn()将获得它的大小信息。
我过去使用的另一个技巧(在我看来有点混乱,但我会在这里给它完整性)是有一个联合数组并使第一个元素成为长度,如:
typedef union {
int len;
float number;
} tNumber;
tNumber number[10];
: : :
number[0].len = 5;
a = fn (number);
然后fn()可以访问长度和所有元素,你不必担心数组/指针二分法。
这具有允许长度变化的附加优点(即,使用中的元素的数量,而不是分配的单元的数量)。但我倾向于不再使用它,因为我认为两个参数的数组版本(大小和数据)更好。
- 3 回答
- 0 关注
- 719 浏览
添加回答
举报