这里依赖于一个事实:声明下标大小为零或负数的数组是非法的。
举个例子
#define STATIC_CHECK(expr) { char unnamed[(expr) ? 1 : 0]; }
这种在编译期检查出错误可以增加程序的健壮性
这里设置一个模板的检查方式
template < bool > struct CompileTime;
template <>
struct CompileTime<true> {};
#define STATIC_CHECK(expr) (CompileTime <expr> != 0 > ( )
当检查到CompileTime<false>()的时候编译器会出错,因为这个是没有定义的