Macro definition ARRAY_SIZE

前端 未结 5 2158
借酒劲吻你
借酒劲吻你 2021-02-19 10:55

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         


        
5条回答
  •  暖寄归人
    2021-02-19 11:33

    As explained, this is a feeble (*) attempt to secure the macro against use with pointers (rather than true arrays) where it would not correctly assess the size of the array. This of course stems from the fact that macros are pure text-based manipulations and have no notion of AST.

    Since the question is also tagged C++, I would like to point out that C++ offers a type-safe alternative: templates.

    #ifdef __cplusplus
       template  struct ArraySizeHelper { char _[N]; };
    
       template 
       ArraySizeHelper makeArraySizeHelper(T(&)[N]);
    
    #  define ARRAY_SIZE(a)  sizeof(makeArraySizeHelper(a))
    #else
    #  // C definition as shown in Google's code
    #endif
    

    Alternatively, will soon be able to use constexpr:

    template 
    constexpr size_t size(T (&)[N]) { return N; }
    

    However my favorite compiler (Clang) still does not implement them :x

    In both cases, because the function does not accept pointer parameters, you get a compile-time error if the type is not right.

    (*) feeble in that it does not work for small objects where the size of the objects is a divisor of the size of a pointer.


    Just a demonstration that it is a compile-time value:

    template  void print() { std::cout << N << "\n"; }
    
    int main() {
      int a[5];
      print();
    }
    

    See it in action on IDEONE.

提交回复
热议问题