【问题标题】:Why would an implementation of custom static assert not immediately static assert "true"?为什么自定义静态断言的实现不会立即静态断言“真”?
【发布时间】: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


【解决方案1】:

测试是合理的,并且已经被#including测试了给定的静态断言定义文件到一些测试源文件中。就像我们制作一个类一样,我们使用示例程序对其进行测试,静态断言在不同的编译器上经过了很好的测试。可能会有一个构建系统,它会在每次修改(比如每次签入)时编译像test_all_asserts.cpp单元测试)这样的文件。

你得到的是具有静态断言定义的头文件,而不是 test_all_asserts.cpp 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多