VC10和C++ 0x (3) - static_assert
2009-09-11 16:07
381 查看
static_assert
断言(assertion)是提高代码质量的有效武器。C++标准库中的assert, MFC中的ASSERT宏/VERIFY宏都是断言的例子,它们的共同点是在运行时对程序状态进行判断,
例如检查函数的参数有效性,检查类的不变式(invariant)等。而C++ 0x中的静态断言呢,和运行时的断言不一样,它是编译时执行检查的。
看下面的例子:
// file: staticfluffykitten.cpp
template struct Kitten {
static_assert(N < 2, "Kitten requires N < 2.");
};
int main() {
Kitten<1> peppermint;
Kitten<3> jazz;
}
编译结果:
staticfluffykitten.cpp(2) : error C2338: Kitten requires N < 2.
staticfluffykitten.cpp(8) : see reference to class template instantiation 'Kitten' being compiled
with
[
N=3
]
上面例子中用static_assert对模板参数N进行了检查,如果断言失败编译器将使用用户自定义的错误消息。
熟悉boost库的朋友对static_assert应该很熟悉 - boost提供了BOOST_STATIC_ASSERT宏跟C++ 0x中的static_assert类似,但是BOOST_STATIC_ASSERT没有使用
用户自定义的错误消息。如果BOOST_STATIC_ASSERT失败,编译时会出现类似下面的错误:
Error: use of undefined type 'boost::STATIC_ASSERTION_FAILURE'
关于boost中的静态断言,参考boost的文档:http://www.boost.org/doc/libs/1_40_0/doc/html/boost_staticassert.html
Technorati Tags: C++
,C++ 0x
,boost
,static_assert
,boost.StaticAssert
,BOOST_STATIC_ASSERT
断言(assertion)是提高代码质量的有效武器。C++标准库中的assert, MFC中的ASSERT宏/VERIFY宏都是断言的例子,它们的共同点是在运行时对程序状态进行判断,
例如检查函数的参数有效性,检查类的不变式(invariant)等。而C++ 0x中的静态断言呢,和运行时的断言不一样,它是编译时执行检查的。
看下面的例子:
// file: staticfluffykitten.cpp
template struct Kitten {
static_assert(N < 2, "Kitten requires N < 2.");
};
int main() {
Kitten<1> peppermint;
Kitten<3> jazz;
}
编译结果:
staticfluffykitten.cpp(2) : error C2338: Kitten requires N < 2.
staticfluffykitten.cpp(8) : see reference to class template instantiation 'Kitten' being compiled
with
[
N=3
]
上面例子中用static_assert对模板参数N进行了检查,如果断言失败编译器将使用用户自定义的错误消息。
熟悉boost库的朋友对static_assert应该很熟悉 - boost提供了BOOST_STATIC_ASSERT宏跟C++ 0x中的static_assert类似,但是BOOST_STATIC_ASSERT没有使用
用户自定义的错误消息。如果BOOST_STATIC_ASSERT失败,编译时会出现类似下面的错误:
Error: use of undefined type 'boost::STATIC_ASSERTION_FAILURE'
关于boost中的静态断言,参考boost的文档:http://www.boost.org/doc/libs/1_40_0/doc/html/boost_staticassert.html
Technorati Tags: C++
,C++ 0x
,boost
,static_assert
,boost.StaticAssert
,BOOST_STATIC_ASSERT
相关文章推荐
- VC10和C++ 0x (3) - static_assert
- VC10和C++ 0x (1) - lambda表达式
- 【转】VC10和C++ 0x (1) - lambda表达式
- C++ 0x 新特性(4):Static_assert
- VC10和C++ 0x (1) - lambda表达式
- VC10中的C++0x特性:Lambdas,auto,以及 static_assert
- VC10和C++ 0x (1) - lambda表达式
- VS2010 中的 C++ 0x 新特性:Lambdas、auto 和 static_assert
- 【译】VC10中的C++0x特性 part 1:Lambdas,auto,以及 static_assert
- VS2010 中的 C++ 0x 新特性:Lambdas、auto 和 static_assert
- 【译】VC10中的C++0x特性 part 1:Lambdas,auto,以及 static_assert
- C++学习 boost学习之-BOOST_STATIC_ASSERT
- VC/C/C++ 代码10
- (来自百度知道)c/c++ VC++ MFC 关于在Static 控件里面作图的问题 详见问题补充,希望能留下QQ,交流一下
- c++特性:static_assert
- VC2010中的C++0x特性 Part 1:Lambdas,auto, static_assert
- [C++] BOOST_STATIC_ASSERT和assert的区别
- win7-64,vs2010带的vc10环境下用dos编译C++的步骤
- C++大学基础教程_10_67_new和delete和static
- C++(10):static、const、mutable、explicit成员