#if !defined(STATIC_ASSERT)
  #if (defined(_MSC_VER) && (_MSC_VER >= 1600)) || __cplusplus >= 201103L
    #define STATIC_ASSERT(e,m) static_assert(e,m)
  #else
   #define ASSERT_CONCAT_(a, b) a##b
   #define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
   /* These can't be used after statements in c89. */
   #if defined(__COUNTER__)
     #define STATIC_ASSERT(e,m) \
       enum { ASSERT_CONCAT(static_assert_, __COUNTER__) = 1/((int)!!(e)) }
   #else
     /* This can't be used twice on the same line so ensure if using in headers
      * that the headers are not included twice (by wrapping in #ifndef...#endif)
      * Note it doesn't cause an issue when used on same line of separate modules
      * compiled with gcc -combine -fwhole-program.  */
     #define STATIC_ASSERT(e,m) \
       enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/((int)!!(e)) }
   #endif
  #endif
#endif