I encountered the following macro definition when reading the globals.h in the Google V8 project.
// The expression ARRAY_SIZE(a) is a compile-time constant of t
latter part will always evaluates to 1, which is of type size_t,
Ideally the later part will evaluate to bool
(i.e. true
/false
) and using static_cast<>
, it's converted to size_t
.
why such promotion is necessary? What's the benefit of defining a macro in this way?
I don't know if this is ideal way to define a macro. However, one inspiration I find is in the comments: //You should only use ARRAY_SIZE on statically allocated arrays.
Suppose, if someone passes a pointer then it would fail for the struct
(if it's greater than pointer size) data types.
struct S { int i,j,k,l };
S *p = new S[10];
ARRAY_SIZE(p); // compile time failure !
[Note: This technique may not show any error for int*
, char*
as said.]