【发布时间】:2015-01-04 08:55:58
【问题描述】:
当 C++ 编译器没有内置 static_assert 时,有多种方法可以实现静态断言。这是 Windows SDK 的一个示例(另一个著名的示例来自 Boost):
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
我从没见过这样的一行:
C_ASSERT(true);
紧跟静态断言实现。
立即测试至少你的静态断言没有在不应该断言的地方断言不是合理的吗?
为什么不立即检查它不断言?
【问题讨论】:
-
测试代码的位置应该在单元测试中,而不是在真实代码中。
-
@Jarod42:我不明白为什么。您在实际代码中静态断言很多东西,不是吗?为什么不在代码中也静态断言“true”?
-
@sharptooth 为什么静态断言实现的每个客户端都必须在每次编译期间支付单个测试的编译开销(尽管可能很小)? static-assert 的作者当然有测试,但是为什么要把这些泄露到面向客户端的代码中呢?
-
@Angew:这是否意味着我不应该在广泛包含的标题中包含任何静态断言?
-
@sharptooth 不,这并没有随之而来。您应该添加代码正常运行所需的所有静态断言。如果您正在实现一个依赖于
sizeof(int) <= 4的超快速缓存,那么肯定是静态断言。但是,如果您正在实现编译时算术,您应该不在您的标头中包含正确性测试。包括先决条件检查,而不是正确性证明。
标签: c++ testing compilation compile-time static-assert