gpt4 book ai didi

c++ - 如何在禁用异常的情况下从 constexpr 函数断言?

转载 作者:行者123 更新时间:2023-11-30 03:44:52 25 4
gpt4 key购买 nike

如果我想断言从小型处理器嵌入式设计中的 C++11 constexpr 函数检测到的错误,关闭中断会取消建议的错误处理方法(参见 eric 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 不会工作,因为我关闭了异常

解决方法是什么?

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

最佳答案

我找到了一种特殊情况的解决方法,您可以保证永远不会在运行时调用您的 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;
}

关于c++ - 如何在禁用异常的情况下从 constexpr 函数断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35186327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com