利用C/C++的语法语义的定义,可以巧妙地完成断言使命:数组长度>0 , switch中case分支不能重复 ,“位域( bitfield )必须具有非零长度“【1】。
1.数组长度>0
“通常,静态断言的机制是定义一个数组,并将表达式的布尔结果作为数组的大小......."。【1】
”考虑下面的例子:
#define STATIC_ASSERT(x) int ar[x]
...
STATIC_ASSERT(sizeof(int) < sizeof(short));
"
“很明显。上面的实现存在诸多问题。数组ar被声明了,却并没有被使用,这将会导致大部分的编译器给出一个警告,阻止你的构建(built)过程。再者,在同一作用域中使用STATIC_ASSERT()两次或两次以上将会导致ar被重复定义的错误。"【1】
新的方案:
” #define STATIC_ASSERT( ex ) do { typedef int ai[ (ex) ? 1 : 0 ]; } while( 0 ) “【1】。
2.switch中case分支不能重复
3.“位域( bitfield )必须具有非零长度“【1】
”#define STATIC_ASSERT(ex) struct x { usigned int v : ex; }"【1】。
【1】抄自《Imperfect C++ 中文版》。Matthew Wilson[著].荣耀 刘未鹏[译].人民邮电出版社.