【问题标题】:how do I assert from constexpr function with exceptions disabled?如何在禁用异常的情况下从 constexpr 函数断言?
【发布时间】:2016-05-13 04:44:36
【问题描述】:

如果我想在小型处理器嵌入式设计中断言从 C++11 constexpr 函数检测到的错误,则关闭中断会取消处理错误的建议方法(请参阅 eri​​c nieblers 回答 here)

这是一个简短的代码示例:

constexpr bool isANumber(char c)
{
    return (c >= '0' && c <= '9');
}

constexpr int charToInt(char c)
{
    return (!isANumber(c))? throw std::logic_error("not a number"):
        c - '0';
}

据我所知:

  • 不允许使用static_assert,因为输入可能是运行时值
  • assert 可能会强制对函数进行运行时评估,并且 assert 处理程序会拖入太多东西,以至于它会溢出大多数 Cortex 芯片的闪存
  • throw 不起作用,因为我关闭了异常

解决方法是什么?

注意:在超级资源受限的嵌入式环境中使用 C++ 必须关闭异常,因为它们使用过多的 RAM(例如,我的芯片只有 16K RAM)。这是常见的做法。

【问题讨论】:

  • 在 C++14 中,你可以在 constexpr 函数中使用 assert。
  • @101010 感谢您的评论,不过我在 C++11 上需要它,将其添加到我的问题中
  • @columbo 感谢您的链接,看来我的问题可能是重复的
  • 看起来 assert 也不是一个选项,因为 GCC 断言将太多东西拖入二进制文件中,我无法在大多数 ARM Cortex 芯片上使用

标签: c++ c++11 exception metaprogramming constexpr


【解决方案1】:

我找到了一种特殊情况的解决方法,您可以保证永远不会在运行时调用您的 constexpr 函数。在这种情况下,您可以强制执行非恒定评估错误。

int assert_failed() {
    static int i = 5;
    return i++;
}
constexpr int cheap_assert(bool i) {
    return i == 1 ? 0 : assert_failed();
}

constexpr unsigned operator""_my_literal(const char* s, std::size_t size) {
    return cheap_assert(size < 10), 0;
}

【讨论】:

  • @Orient 不在 MSVC2015 上,但我认为你的权利可能是微软的错误
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2012-10-04
  • 2012-04-07
  • 2011-09-25
相关资源
最近更新 更多