How can I use “sizeof” in a preprocessor macro?

在编译时用sizeof检查某个数据类型是否是期望的字节个数,或者对两种数据类型的字节数进行比较

#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. */
#ifdef __COUNTER__
  #define STATIC_ASSERT(e) \
    ;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) \
    ;enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(int)(!!(e)) }
#endif

样例:

STATIC_ASSERT(sizeof(int) == 4);
STATIC_ASSERT(sizeof(stu_t) <= sizeof(prio_t));

原文链接:http://www.pixelbeat.org/programming/gcc/static_assert.html

你可能感兴趣的:(coding)