C常用数组长度macros?

我已经看到几个数组长度浮动的macros:

从这个问题来看:

  • #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])) 

我想知道的是:

  1. 那些使用array[0]*array的区别是什么?
  2. 为什么要么是首选?
  3. 他们有不同的C ++?

这是一个更好的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 ++types,重载operator[]()

除了作为arrayparameter passing指针的许多(但不是全部)情况之外,除法操作(在编译时应该被捕获,因为它是编译时常量expression式)。

请参阅C中是否有一个标准函数返回数组的长度? 更多细节。

C ++代码有更好的select。 有关详细信息,请参阅编译时间sizeof_array而不使用macros 。

  1. 那些使用array [0]和* array的区别是什么?
  2. 为什么要么是首选?
  3. 他们有不同的C ++?

(1)在C中没有区别。

(2)没有技术上的偏好,但新手可能会被指针解除引起困惑。

(3)在C ++中,你通常不会使用这个macros,因为它非常不安全。 如果你传入一个指针而不是一个实际的原始数组,代码将会被编译,但是会产生不正确的结果。 所以在C ++中,你应该/应该使用一个函数模板,比如…

 #include <stddef.h> typedef ptrdiff_t Size; template< class Type, Size n > Size countOf( Type (&)[n] ) { return n; } 

这只接受实际的原始数组作为参数。

它是函数startOfendOfcountOf的三部分的一部分,定义非常方便,可以将它们应用于原始数组和标准库容器。 据我所知,这个黑社会首先由Dietmar Kuehl发现。 在C ++中,0x startOfendOf最有可能是std::beginstd::end

干杯&hth。,

1)没有,数组的值是指向它的第一个元素的指针。 所以* array == array [0]
2)个人偏好
3)没有

请注意,如果在函数内部调用该数组作为parameter passing给该函数,则该macros不会工作。 这是因为数组对象通过“衰减”而不是深度复制。