Q:

C++ the meaning of getting size of a array

Here is a macro for getting array size
#define array_size(array) \
(sizeof( array ) / (sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*)))

I think normally (sizeof( array ) / (sizeof( array[0] )) is good enough to get the size of the array. 
I guess the part
(sizeof( array[0] ) * (sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*)) 

is to avoid the whole thing divided by zero, anyone could help to explain?
Thanks in advance.
Cheers,

A:

Multiplying sizeof array[0] in the divisor by
(sizeof( array ) != sizeof(void*) || sizeof( array[0] ) <= sizeof(void*))

makes the divisor zero if
sizeof array == sizeof(void*)

and
sizeof array[0] > sizeof(void*)

In those cases, you get a division by zero during the compilation, which would cause the compilation to fail.
These checks are an attempt to detect arguments that are pointers (be they the result of array-to-pointer conversion or not), since one can't know how large an "array" a pointer points to by using that quotient.
It fails if other pointer types have different sizes than void*, and it doesn't detect pointers to things that are not larger than void*s. It probably does more harm than good by lulling the author in a false sense of security.

A:

I think normally (sizeof( array ) / (sizeof( array[0] )) is good enough to get the size of the array.

Although it is not your primary question, but you mentioned it. The correct way to determine array size in C++ is using templates:
template<typename T, size_t size>
constexpr size_t array_size(T(&)[size]){
    return size;
}

