网页设计与网站建设 入门必练,电子商务搭建网站,郑州一凡网站建设,网页制作设计c11中的静态断言(static_assert)
在c11中引入了#xff0c;目的是在编译时就能检查处一些问题。写法如下#xff1a;
static_assert(常量表达式#xff0c;提示字符串);如果第一个参数常量表达式的值为真(true或者非零值)#xff0c;那么static_assert不做任何事情#…c11中的静态断言(static_assert)
在c11中引入了目的是在编译时就能检查处一些问题。写法如下
static_assert(常量表达式提示字符串);如果第一个参数常量表达式的值为真(true或者非零值)那么static_assert不做任何事情就像它不存在一样否则会产生一条编译错误错误位置就是该static_assert语句所在行错误提示就是第二个参数提示字符串。 非常简单的例子如下
int main () {static_assert(1 ! 1, 1 1 is true.);return 0;
}
结果In function int main(): 29:5: error: static assertion failed: 1 1 is true.
编译不通过。 优点如下
1使用static_assert我们可以在编译期间发现更多的错误提前找出错误的原因。
2static_assert可以用在全局作用域中命名空间中类作用域中函数作用域中几乎可以不受限制的使用。
3编译器在遇到一个static_assert语句时通常立刻将其第一个参数作为常量表达式进行演算但如果该常量表达式依赖于某些模板参数则延迟到模板实例化时再进行演算这就让检查模板参数成为了可能。
4由于之前有望加入C0x标准的concepts提案最终被否决了因此对于检查模板参数是否符合期望的重任就要靠static_assert来完成了所以如何构造适当的常量表达式将是一个值得探讨的话题。
5性能方面由于是static_assert编译期间断言不生成目标代码因此static_assert不会造成任何运行期性能损失。
在一些开源的代码中使用到了静态断言例如rocksdb、mysql等其中mysql中的table_helper.cc中的一个函数的例子如下
void set_field_mdl_type(Field *f, opaque_mdl_type mdl_type) {static_assert(MDL_TYPE_END 11,Adjust performance schema when changing enum_mdl_type);// ...// ...
}